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 会继续执行本次循环。