Chinaunix首页 | 论坛 | 博客
  • 博客访问: 662250
  • 博文数量: 137
  • 博客积分: 7000
  • 博客等级: 少将
  • 技术积分: 1335
  • 用 户 组: 普通用户
  • 注册时间: 2005-11-23 15:18
文章分类

全部博文(137)

文章存档

2010年(2)

2009年(2)

2008年(2)

2007年(30)

2006年(99)

2005年(2)

我的朋友

分类:

2007-05-14 17:27:21

第二章 标量

1.当在需要数字的地方使用了字符串(如,乘法),Perl将自动把字符串转换为其等价的数字,就像输入的是十进制浮点数一
样。因此 "12"*"3"将给出36。后面的非数字部分和前面的空格将被去掉,如 "12fred34"*"3"将给出 36 而不会用任何
提示。在极端情形,当一个不含任何数字的字符串将别转换为0。如,将 “fred”当作数字来使用时。

2.在命令行中使用 -M 这个参数,仅当需要 diagnostics (诊断)时才用,而不用每次通过修改源代码来决定是否
激活diagnostics:
$ perl-Mdiagnostics./my_program

3.标量变量在Perl 中由$开头。在 shell 中,当取值时,需要$;赋新值时,不需要 。在awk 和C 中,完全不需要$。

4.由于字符串'0'和数字0 有相同的标量值,Perl 将它们相同看待。也就是说字符串'0'是唯一
一个非空但值为0 的串。




第三章 列表和数组

1.reverse操作符会返回次序相反的列表,但它不会影响自己的参数。

2.sort操作符与reverse一样不会改变参数本身,所以要对数组排序时必须将排序的数组存回数组。

3.假函数scalar可以用来强制指定使用标量上下文。




第四章 子例程

1.在my不加括号时只会声明一个词法变量。
   my $fred, $barney;        #错!没声明$barney
   my ($fred, $barney);        #两个都声明了

2.假如子例程和Perl内置函数同名,则必须加&符号来调用该函数。尽量加&符号来调用子例程。




第五章 输入与输出

1.如果<>操作符的输入参数是连字符(-),则代表的是标准输入。

2.@ARGV数组由Perl解释器事先建立,其内容就是调用参数所组成的列表。需要注意的是程序自己的名称在特殊变量$0中,而不是位于@ARGV中

3.select操作符可以改变默认的文件句柄,一旦选择(select)了默认输出用的文件句柄,程序就会一直以此方式运作。当所指定的默认文件句柄使用完毕之后,最好把它设回原本的默认值。

4.特殊变量$|设定为1,会使当前的(也就是修改变量时所指定的)默认文件句柄在每次进行输出操作后,立即清空缓冲区。



第六章 散列

1.keys函数会返回当前散列中的所有键,而values函数返回相应的每个值。

2.each函数返回散列中的一个"键-值对",一次返回一个,没有更多"键-值对"时返回空列表。

3.exists函数查看某个键是否存在于散列中,如果有就返回真:
  if (exists $books{"dino"}) {
    #do something ...
  }

4.delete函数从散列中移除指定的键:
  delete $books{"dino"};



第七章 正则表达式

1. .    匹配换行符(\n)以外的所有单个字符。
   *    匹配它的前一个项目0次或多次。>=0
   +    匹配它的前一个项目1次或多次。>=1
   ?    匹配它的前一个项目0次或1次。 0,1

   \    转义
   |    或,左边匹配或右边匹配
   ^    锚点,标示字符串开头
   $    锚点,标示字符串结尾

   ()   模式组
   []   字符集,里面一连串可能的字符,但只会匹配单一字符
   [^]  排除字符集
   \d   字符集[0-9]
   \w   字符集[A-Za-z0-9_]
   \s   空白集,相当于字符集[\f\t\n\r]
   \D,\W,\S  相当于[^\d],[^\w],[^\s]
   \b   单词边界锚点,匹配一个单词的头尾两端
   \B   非单词边界锚点,匹配任何不匹配\b的位置



第八章 以正则表达式进行匹配

1.m//  进行匹配
  /i   不区分大小写的模式来匹配
  /s   匹配任意字符,即"."号也可以匹配换行符\n
  /x   忽略模式里的空白
  /m   跨行模式匹配,让^,$两个锚点可以代表换行号

  =~   绑定操作符,用右边的模式匹配左边的字符串,而不是匹配$_
  $n   暂时记忆对应的第n个模式组匹配到的字符串
  $&   记忆字符串里实际匹配模式的部分
  $`   保存正则表达式引擎找到匹配前略过的部分
  $'   保存字符串中剩下的、从来没有匹配到的部分

2.通用量词
  /a{m,n}/    匹配a字符m到n次
  /a{n,}/     匹配a字符n次以上
  /a{n}/      匹配a字符n次
  {0,}        相当于*
  {1,}        相当于+
  {0,1}       相当于?

3.优先级
  括号 > 量词以及反复操作符 > 锚点与序列 > 分隔竖线



第九章 以正则表达式处理文本

1.s///    进行替换,注意,可以使用不同的界定符
  /g      进行全局替换
  \U      会将其后的字符转换成大写
  \L      会将其后的字符转换成小写
  \u      会将其后的一个字符转换成大写
  \l      会将其后的一个字符转换成小写
  \E      关闭大小写转换功能

2.split操作符将会以作为分隔符的模式扫过所指定的字符串,并且返回由该模式所分隔出来的一串字段。
  @fields = split /:/, "abc:def:g:h";   #产生("abc","def","g","h")
  split会保留开头处的空字段,会舍弃结尾处的空字段。
  split的默认行为是以空白字符拆开$_,split /\s+/, $_;

3.join函数与split效果相反:
  my $res = join $glue, @pieces;
  列表@pieces至少需要两个元素,否则glue不会出现
  join的第一个参数是字符串,而不是模式。

4.列表上下文中使用模式匹配操作符(m//)时,如果匹配成功,则其返回的列表内容是所有内存变量的内容;如果匹配失败,则会返回空列表。

5.$^I变量默认值是undef,当它与<>操作符结合使用时,<>会先打开指定的文件,并将该文件改名为"原文件名+$^I"的形式,然后以原文件名打开一个新文件,从而达到备份修改的目的。
  如果把$^I设为空字符串,则会直接修改文件的内容,不会留下任何备份文件。

6.不具备记忆功能的圆括号————在左圆括号后面加上问号和冒号"(?:"




第十章 其他控制结构

1.循环控制
  last    循环块紧急出口,相当于C中的break。
  next    跳到循环块底端,继续执行下次迭代,相当于C中的continue。
  redo    跳到循环块顶端,不经过任何测试条件,不前进到循环下一次迭代。

2.and or not xor 优先级比&& || ! ^ 低。



第十一章 文件测试

1.如果文件测试操作符后面没有写文件名或文件句柄,则默认的操作数是$_里面的文件名称

2.stat和lstat的默认参数是$_

3.time函数          取得系统当前时间戳。
  localtime函数     将时间戳转为较易阅读的形式。
  gmtime函数         返回世界标准时间。

4.特殊的"下划线文件句柄"
  对特殊的_文件句柄进行stat、lstat或文件测试,就是告诉Perl从内存里找出前一次文件测试、stat或lstat的参考数据来用,而不是到外面向操作系统再要一次数据。





第十二章 目录操作

1.chdir    改变目录
  glob     文件名匹配,注意,也可以用<>角括号语法来替代,要注意与文件句柄读取混淆。
  readline 间接式读取文件句柄
  opendir
  closedir
  readdir  注意,操作符返回的文件名并不包含路径名称,它们只是目录里的名称。
  unlink   删除文件,返回成功删除的文件数目,但不能用来移除目录。
  rename   重命名文件,也可用来移动文件。
  link     建立硬链接。
  symlink  建立软链接。
  readlink 返回符号链接所指向的位置,或在参数不是符号链接时返回undef。
  mkdir    创建目录
  rmdir    移除空目录,返回成功删除的目录数量。
  oct      强制把字符串当成八进制数值处理,无论它是否以0开头。
  chmod    更改权限
  chown    更改所有者及所属组,必须以数值形式的用户标识符及组标识符来指定。返回受影响的文件数目。
  getpwnam  用户名转数值形式
  getgrnam  组名转数值形式
  utime    修改时间戳

2.任何目录的链接数都至少是2:一个位于它的上层目录的列表里,一个位于它本身的列表里。除此之外,如果里面有子目录,则每个子目录还会通过..项目再增加一个链接。这表示目录的链接数一定等于子目录的数量加上2

3.在目录列表中,任何inode所指向的数据都只能放在同一个经挂载的存储设备里。
  不能为目录建立额外的名称。

4.$$       进程标识符变量
  $!       错误信息
  $?       存储前一次system或反引号括住命令的返回值
  $@       存放eval捕获的错误信息。




第十三章 字符串与排序

1.index        寻找子字符串出现的位置,可以有第三个参数指明开始位置
  rindex       反向寻找子字符串出现的位置,可以有第三个参数指明开始位置
  substr       3个参数:一个字符串,一个从0起算的初始值,需要的子字符串的长度,返回子字符串。省略第三个参数截取到行尾。

2.<=>数值比较操作符,比较两个数值,返回-1,0或者1
  cmp字符串比较操作符



第十四章 进程管理

1.system    执行一个shell命令,返回0则正常。
  exec      执行一个shell命令,之后Perl进程不存在。
  kill      发送信号命令

2.%ENV   特殊散列,每个散列键代表一个环境变量

3.反引号(``)捕获命令执行后的输出结果
  注意,标量上下文返回一个字符串,列表上下文返回一个列表

4.将进程视为文件句柄
  要启动并发运行的子进程时,将命令放在open调用的文件名部分,并且在它前面或后面加上竖线号(|),即管道式打开(piped open)
  竖线在命令右边表示命令执行的标准输出连接到供程序读取的文件句柄
  竖线在命令左边表示命令执行的标准输入连接到供程序读取的文件句柄

5.fork后父进程的返回值为子进程的pid,子进程的返回值为0

6.特殊散列%SIG赋值时会启动信号处理程序(直到撤销为止)。散列键是信号名称(省略固定不变的SIG前缀),散列值是命名去除&符号的子例程的字符串。
  $SIG('INT') = 'my_int_handler';



第十五章 Perl模块

use File::Basename qw/ /;
 ->   方法



第十六章 一些高级Perl技术

1.eval捕获错误,如
  eval{ $barney = $fred / $dino };
  eval是表达式,故块的最后必须要有分号。
  $@存放捕获的错误信息。
  如果没有错误发生,返回值由最后所执行的表达式来决定,或由可有可无的return关键字提早返回。

2.grep从列表中选出项目
  第一个参数是一个块,它会以$_作为列表中每个项目的占位符(placeholder)并且返回布尔(真/假)值。
  剩下的参数则是grep操作符所要搜索的项目列表:
  my @odd_numbers = grep { $_ % 2 } 1..1000;
  my @matching_lines = grep /\bfred\b/i, #挑出含fred单词的行

3.map转换列表中的项目
  与grep的区别是,map返回的是处理过后的数据,而不是原来列表中的数据。
  {}块中对列表进行了处理,并将处理的结果作为列表值返回。
  print "Some powers of two are:\n",
    map "\t" . (2 ** $_) . "\n", 0..15;

4.大箭号(=>)与逗号之间一个重要的差异是:在=>左边的未经修饰的文字会被视为已加上引号,但右边的不会。

5.列表切片(list slice)
  Perl可以把列表当成数组,用索引取得里面的值:
  要使用列表切片必须在圆括号里的列表后面接由方括号包住的下标表达式。
  my $mtime = (stat $some_file)[9];
  my($card_num, $count) = (split /:/)[1, 5];

6.数组切片(array slice)
  my @numbers = @names[9, 0, 2, 1, 0]; #注意用的是@不是$

7.散列切片
  两个写法,%score,散列
  1) my @scores = ($score{"barney"}, $score{"fred"}, $score{"dino"});
  2) my @scores = @score{qw/ barney fred dino/}#注意,用的是@不是%
  又如用如下形式对散列%score赋值
  my @players = qw/ barney fred dino/;
  my @scores = (100, 200, 90);
  @score{ @players } = @scores;

8.切片一定都是列表。
  在Perl里,$符号表示只有单项事物,@符号表示一连串的项目,而%符号则表示一整个散列。
阅读(2576) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~