Perl Note(1)

特殊的转义字符:

\l 下个字符小写

\L接着的字符均小写直到\E

\u下个字符大写

\U接着的字符均大写直到\E

\Q在non-word字符前面加上\,直到\E

\E 结束\L, \E和\Q

 

关于undef 和 define 函数

能返回 undef 的操作之一是行输入操作,<STDIN>。通常,它会返回文本中的一行。但如果没有更多的输入,如到了文件

的结尾,则返回undef。要分辨其是undef 还是空串,可以使用 defined函数,它将在为undef 时返回false,其余返回true。

 

如果想声明自己的undef 值,可以使用undef:

$madonna = undef ; #同$madonna 从未被初始化一样。

 

反向索引

如有一rocks 数组,其最后一个元素的索引为$#rocks .一种简便方法:数组的负数索引值从最后一个元素开始。

 

#pop, push, shift, unshift调用语法

$barney = pop @array;

push(@array,0);

$m = shift (@array);

unshift(@array,5);

 

reverse 返回逆转的列表,它不会改变其参数的值。如果返回值没有赋值给某个变量,那这个操作是没有什么意义的:
reverse @fred; #错误,没有改变@fred的值

@fred = reverse @fred; #改变了@fred的值

 

#scalar函数强制输出标量

print “ I have ” , @rocks, “rocks!"n” ; #错误,输出 rocks的名字

print “ I have ” , scalar @rocks, “ rocks!"n” ; #正确,输出其数字

 

use strict; #迫使采用更严格的检测

 

子程序调用省略参数括号

 如果Perl 内部的编译器知道此子程序的定义,则可以省掉其参数的括号,如可以把子程序定义放在调用的前面。

 

<>操作符输入流

<>从数组@ARGV中得到调用参数。这个数组是Perl 中的一个特殊数组,其包含调用参数的列表。 <>操作查看@argv 来决定使用哪些文件。如果表为空,则使用标准输入流;否则,使用其找到的相应文件。

 

printf相关 

如果宽度值为负数,则为左对齐(对于所有的格式符):
print “ %-15s"n” , “ flintstone” ; #输出为flintstone○ ○ ○○
%f根据需要进行截尾,你可以设置需要几位小数点后面的数字:
printf “%12f"n”, 6*7 + 2/3; #输出为:   ○ ○ ○42.666667
printf “%12.3f"n”, 6*7 + 2/3; #输出为: ○ ○○ ○ ○○ 42.667
printf “%12.0f"n”, 6*7 + 2/3; #输出为: ○ ○ ○○ ○ ○○ ○ ○○ 43

要输出一个百分号,可以使用%%,它不会使用后面列表中的元素

 

数组与printf

printf“ The items are:"n”. (“ %10s"n”x @items), @items;


Perl自身有六个文件句柄:STDIN,STDOUT,STDERR,DATA,ARGV,ARGVOUT


open CONFIG, “ dino” ;#default to be read
open CONFIG, “ <dino” ;#same as above
open BEDROCK, “ >fred” ;#write

open LOG,“ >>logfile” ;#append

 

my $success = open LOG, “>>logifle”; #将返回值保存在$success中
if(!$success){
#打开失败时
...

}

 

die 函数来创建我们自己的严重错误。

if(!open LOG, “>>logfile”){
die “Cannot create logfile:$!”;

}

 

if open LOG, ">>logfile" or

    die "Cannot create logfile:$!";

 

warn 函数像 die 那样工作,除了最后一步,它不会从程序中退出。

 

默认情况下,如果不指定文件句柄给 print(或者 printf,这里的内容对两者均适用),则默认会使用 STDOUT。但这个默认属性,可以通过select 操作进行更改。如下:
select BEDROCK;
print “ I hope Mr. Slate doesn’ t find out about this."n” ;

print “ Wilma!"n”

 

将变量$|设置为1,将会在输出操作结束时会立刻清空文件句柄。 (I tried, but it didnot work.)

 

Hash操作

要访问hash 元素,可以使用下面的语法:

$hash{$some_key}

 

将hash 转变成其它形式更加常见。例如,我们可以将hash 反转:

%inverse_hash = reverse %any_hash;

 

keys函数会返回此 hash 的所有keys,values函数将返回所有的 values。如果 hash 中没有元素,则此函数将返回空列表:
my %hash = (“a”=>1, “ b”=>2, “ c”=>3);
my@k = keys %hash;

my@v = values %hash;

 

each 函数

while (($key, $value) = each %hash){
print “ $key => $value"n” ;

}

 

使用 exists 函数,如果hash 中存在此 key,则返回true,这和是否有对应的value 无关 .

 

delete函数将某个给定的 key(包括其对应的value)从hash 中删除。(如果不存在这个key,则什么也不做;不会有警告或者错误信息。)

 

正则表达式

要匹配某个模式(正则表达式)和$_的关系,可以将模式放在正斜线(//)之间.

 

元字符与字符类型

点(.)可以匹配任何除换行符之外的单字符。+,?,*可以放在一个字符后,也可以放在使用()进行分组之后的模式后。

\d == [0-9]                \D非数字

\w == [A-Za-z0-9]     \W非word字符

\s == [\f\t\n\r ]          \S非空白字符

 

if(/yes/i) {#i大小写无关
print “ In that case, I recommend that you go bowling."n” ;

}

 

默认情况下,点(.)不匹配换行符,这对于“ 单行中查找” 的问题能很好解决。如果你的字符串中有换行符,并希望点(.)能匹
配它们,那可以使用/s这个修饰符。它将模式中点(.)的行为变成同字符类["d"D]的行为类似:可以匹配任何字符,包括换
行符。

if(/Barney.*Fred/s){
print “That string mentions Fred after Barney!"n”;
}

 

/x修饰符,允许你在模式中加入任何数量的空白,以方便阅读:
/ -?"d+".?"d*/ #这是什么含义?

/ -? "d+ ".? "d* /x #要好些

由于注释可以表示空白,因此,下面是一个包含注释的例子:
if (m{
barney #小个子小伙
.* #可以包含任何字符
fred #嗓门大的小伙
}six) { #修饰符包括包括/s, /i, /x
print “ That string mentions Fred after Barney!"n” ;
}


锚定与绑定

^与$分别为串头和串尾锚定,而\b为词锚定,如/\bcat\b/将match单词cat而非其他,而\B为非词锚定,如/\bcat\B/将匹配由cat开头的其他单词。=~为模式绑定。模式可以内插变量,如/^($var)/。

 

匹配的变量保存 :$'$&$'

$`中含有正则表达式引擎在匹配成功前所找到的变量,而$'为此模式还没有匹配的剩余部分。如果将这三个变量放在一起,你将得到原始字符串。


精确匹配数字范围

模式/a{5,15}/将匹配5 个到15个a 中的任意一个(包括 5,和15)。如果a出现了 3次,则次数太少,而不能匹配上;如果出现5 次,则匹配上了;如果出现 10次,仍然匹配上。如果出现 20次,仍将匹配上,前15个将匹配上。如果省略掉第二个数字(逗号留下),现在没有上限了。如果除了上限数字外,逗号也被省略了,那将匹配确定的次数。

 

匹配的返回值

s///会返回一个 Boolean值。如果成功替换则返回true;否则返回 false。

 

s///分隔符改变:如果使用的是配对的字符,也就是说其左字符和右字符不的,则必需使用两对:一对存放模式,一对存放替换的字符串。如s{fred}{barney};

 

关于替换串中的大小写

有时,希望确保被替换的字符串均是大写的(或者不是,视情况而定)。这在 Perl 中只需使用某些修饰符就能办到。"U 要

求紧接着的均是大写:

$_ =“ I saw Barney with Fred.” ;

s/(fred|barney)/\U$1/gi; #$_现在是 “ I saw BARNEY with FRED.”

默认时,会影响到剩余的(替换的)字符串。可以使用"E来改变这种影响:

s/("w+) with ("w+)/\U$2\E with $1/i; #$1现在是 “ I saw FRED with barney.”

也可以要求后面的均为小写:\L.

使用小写形式时(\l和\u),只作用于下一个字符.

 

split与 join

split /pattern/, $var;

默认时,split对$_操作,模式为空白:
my @fields = split; #同 split /"s+/, $_;

join 函数类似于:
my $result = join $glue, @pieces;

my $x = join“ :” , 4, 6, 8, 10, 12; #$x 为 “ 4:6:8:10:12”

 

列表与匹配

在列表 context 中使用模式匹配(m//)时,如果匹配成功返回值为内存变量值的列表;如果匹配失败则为空列表:
$_ =“ Hello there, neighbor!” ;
my($first, $second, $third) =/(\S+) (\S+), (\S+)/;
print “ $second is my $third"n”

 

Hash与匹配

如果有不止一对括号,每一次返回不止一个字符串。例如将字符串放入 hash 中,如下:
my $data = “ Barney Rubble Fred FlintstoneWilma Flintstone” ;

my %last_name = ($data =~ / (\w+)\S+(\w+)/g)

 

贪婪与非贪婪

perl的正则表达式引擎是贪婪的,因此.*将尽可能匹配多的字符。可以使用非贪婪的数量词 +?, *?。

 

多行

/m 这个正则表达式选项允许它们根据内部的换行符进行匹配(将m看作多行(think m for multiple lines))。这时锚定针对每一行,而非整个字符串。

 

文件备份

变量$^I:如果没有指定文件名,则其从标准输入流中自动打开和关闭一系列文件进行读入。但如
果$^I中有字符串,这个字符串则会成为备份文件的扩展名。

 

非捕捉用的括号(non-capturing parentheses),对于它,有一个特殊的写法。我们在开括号后面加上一个问号和冒号,(?:)

 

其他逻辑控制符

last == break in C

next == continue in C

redo 它会调到当前循环块的顶端,不进行条件表达式判断并接着本次循环。 next 和 redo 的最大区别在于,next 会进入下一次循环,而 redo 会继续执行本次循环。

posted @ 2008-08-25 17:00  xiaoyixy  阅读(303)  评论(0编辑  收藏  举报