Mengdong的技术博客

学习,记录,分享

导航

《Beginning Perl》读书笔记1:0~3章

Perl概览

Perl最早由Larry Wall开发,是一种“胶水”语言,例如将上一个程序的输出做简单处理,转换为下一个程序的输入。第一版Perl发布于1987年12月18日,然后一直稳步升级,直到Perl 5. Perl 5是一个大升级,包含了一些对于Perl 4旧有语法的改进。该书写作之时的Perl版本是5.10.1。Perl仍在不断升级中,下一个大版本是Perl 6,Perl 6是全部重写的Perl实现,与之前的版本不同,完全由社区贡献代码。

Perl的宗旨是“不止一种做法”(TMTOWTDI, There’s More Than One Way To Do It.)。具有以下优点:

  • 易于学习
  • 代码可读性好
  • 可移植(portable)
  • 善于进行文本处理
  • Perl是高层语言(high-level language),无需像C/C++考虑诸多细节

第1章:初识Perl

Hello, World!

第一个Perl程序(helloworld.pl):

#!/usr/bin/perl

use warnings;

print "Hello, world!\n";

 

 

Perl将源码中#之后到行尾的内容视为注释。而在Linux/Unix中,#!program表示由program处理该文本文件,因此首行写#!/usr/bin/perl表示该文件由/usr/bin/perl处理,若该文件有+x权限,则执行./helloworld.pl等同于执行perl helloworld.pl

开启警告信息

在源码开始处声明

use warnings;

或以-w参数调用perl运行.pl源码均可开启警告信息

调试

使用perl –d运行.pl可以调试

第2章:标量

Perl中的标量(scalar)是指单个的简单数据类型,例如整数、浮点数、字符串。字面量(literal)是一个常量,例如5. 变量是可以重赋值的标识符,所有变量以$开头,例如$number。

数字

  • Perl中可以用下划线为数字分段,例如10,000,000可以写作10_000_000
  • 十进制数直接写,0开头八进制,0b开头二进制,0x开头十六进制

字符串

  • 单引号对’’/双引号对””均可表示字符串,区别是单引号对中的字符串不处理转义符(’除外,\’表示’),例如print '\tThis is a single-quoted string.\n'; 输出\tThis is a single-quoted string.\n而双引号对中的字符串处理转义符。
  • 也可以用q//和qq//表示字符串(两/间为字符串内容),q//相当于单引号写法,qq//相当于双引号写法。除/外可以使用任何非字符、非数字的字符,例如|、#. 除此之外还可以使用{}、[]、()、<>这四种符号对。
  • 可以用就地文档(here-document)在代码中包含大量文本。就地文档的格式是:

<<label

文档内容

label

其中label可以是EOF或是EOT. 文档内容按照双引号写法的字符串内容处理。通常有字符串过长有多行时可用就地文档声明,例如:

print <<EOF;

This is a here-document. It starts on the line after the two arrows,

and it ends when the text following the arrows is found at the beginning

of a line, like this:

EOF

 

  • 数字/字符串转换
    • "0.25" * 4的值为1
    • hex()函数将十六进制写法的数值字符串转换为Number类型
    • oct()解析八进制写法的数值字符串

运算符

  • +、-、*、/、++、--、(、)、&、|、^、~、==、!=、&&、||、!、=、,同C/C++、Java
  • $a = $a <some operator> $b; 可以简写为$a <some operator>= $b; 例如$a=$a+$b可以写作$a+=$b同C/C++、Java
  • **是幂运算运算符,2**4=16
  • Perl中以下值是布尔值false:0(数字0)、”0”(字符串”0”)、””(空字符串)、Undefined、空表(empty list)
  • <=>运算符:a<=>b比较a和b的大小,a大为1,相等为0,b大为-1
  • 字符串运算符:.为字符串合并算符,”ba”.”nana”->”banana”
  • 通过x可以进行字符串乘法”ba”.(”na” x 2) ->”banana”
  • ord()可取得一个字符的ASCII值,例如ord(“f”)->102

变量

  • 变量作用域为当前代码块以及该代码块内的所有子块。
  • 通常情况下可任意声明、赋值变量。但这样存在一个问题,如果一开始声明$foo = 4; 而后面写成了$ofo = 7;会使得代码工作不正确(而且还一下子发现不了)
  • 可通过声明use strict;让Perl严格检查变量使用。使用未定义/初始化的变量将会导致编译错误。在strict模式下声明变量必须使用my关键字,例如my $record;. 为了代码规范易维护建议使用use strict
  • 特殊变量:有一些特殊变量,例如$_代表了很多函数输入、输出的默认参数。关于特殊变量可参考perldoc perlvar
  • 双引号中可使用变量,变量将会被代换为其值。例如
my $name = "fred";
my $salutation = "Dear $name,";

print $salutation, "\n";

输出

Dear fred,

标准输入<STDIN>

  • my $yen = <STDIN>;从STDIN中读一次,每赋值一次就读一次
  • chomp()修改输入参数的指定的字符串,如果该串最后一次字符是换行符,则将其去掉,如果不是则不做修改
  • chop()函数移除输入字符串的最后一个字符
  • chomp()和chop()直接修改输入,无返回值

两个函数

  • exit()用于退出,exit()等价于exit(0),正常退出。exit(1)为带错误退出
  • die()用于报错退出,die接受一个字符串参数,将其打印至STDERR然后exit(1)退出两个函数

第3章:流程控制

  • 与C/C++、Java相同的:
    • if(){…}else(){…}
    • for(init; cond; op){…}
    • while(cond){…}
    • do{…}while(cond)
    • 无限循环while(1){…}
  • 逻辑算符
    • 字符串比较算符:gt(>)、lt(<)、ge(>=)、le(<=)、eq(==)、ne(!=) 注意括号内仅为注释,不可替代通用
    • defined($var)算符。如果$var已定义则为true,反之false.
    • 可用and代替&&,or代替||,not代替!. 注意and/or/not的算符优先级与&&/||/!不同
    • if(){…}elseif(){…}elseif(){…}else(){…}可用于多分支流程控制
    • unless(cond)等价于if(!cond)
    • 可以将
if ($number == 0) {

die "can't divide by 0";

}

 

写作

die "can't divide by 0" if $number == 0;

 

  • until(cond){…}等价于while(!cond){…}
  • foreach my $var list可用于使用变量$var遍历列表list,例如foreach my $number (1 .. 10) {…}
  • do{…}until(cond)等价于do{…}while(!cond)
  • Perl中的last等于C/C++、Java中的break,next等于continue
  • redo语句可以重启循环,从循环开始处执行。注意redo重启循环对于for和while/until并不进行条件检查,而是直接从头开始执行循环(个人理解,就是在next的基础上去掉条件检查)
  • 循环标记。默认last、next、redo仅仅对所在的那一层循环有效。如果想跳至外层则需要使用标记:
OUTER: while ($i <= 5) {

my $j = 1;

while ($j <= 5) {

last OUTER if $j == 3;

print "$i ** $j = ", $i ** $j, "\n";

$j++;

}

$i++;

}

 

posted on 2012-04-28 16:30  mdyang  阅读(815)  评论(0编辑  收藏  举报