perl 学习笔记完
第六章 I/O基础
从标准输入进行输入
while (defined($line = <STDIN>)) {
print "I saw $line";
};
因为行输入操作符在你到达文件末尾时会返回undef,所以可以用它方便地跳出循环。
从钻石操作符进行输入
“<>”
是一种特殊的行输入操作符,它可以是也可以不是来自键盘的输入。
while (defined($line = <>)) {
chomp($line);
print "It was $line that I saw!\n";
};
如果用a,b,c三个参数调用该程序,将打印三个文件的内容。使用钻石操作符,就好像输入文件被合并到一个大文件中。上面程序可用快捷方式写成:
while (<>) {
chomp;
print "It was $_ that I saw!\n";
};
大多数linux标准工具中,短横-代表标准输入流。
通常在一个程序中只用一个钻石操作符,当初学者在程序中放第二个钻石时,其实他们一般是想用$_。记住,钻石操作符读取输入,但输入本身是在$_中。
调用参数
钻石操作符并不是直接从字面上读取调用参数,它实际上读取@ARGV数组。它被perl解释器预设为调用参数的列表。在程序中可以对该数组进行赋值等操作。
@ARGV = qw# a b c #; 强制读取这三个文件
while (<>) {
chomp;
print "It was $_ that I saw!\n";
};
向标准输出进行输出
print @array; aabbcc
print "@array"; aa bb cc
print <>; cat 的源代码
print sort <>; sort 的源代码
用printf进行格式化输出,和c类似。
数组与printf
可动态形成格式字符串。
my @items = qw ( a b c );
my $format = "the items are:\n".("%10s\n" x @items); 在标量上下文中使用@items得到它的长度
printf $format,@items 在列表上下文中使用@items得到它的内容
上下文太重要了。要好好感受。
第七章正则表达式的概念
正则表达式(regular expression),在perl中经常被称为模式 (pattern),是与一个给定字符串匹配或不匹配的模版。
不要把正则表达式和被称为glod的shell的文件名匹配模式混淆。比如*.pm匹配以.pm结尾的文件名。
使用简单的模式
要比较一个模式和$_的内容,只需把模式放在一对斜杠之间,如下:
$_ = "aabbkdkdk";
if ( /aabb/ ) {
print "it matched!\n";
};
关于元字符
在正则表达式中有一组具有特殊意义的字符,叫元字符,如:.号匹配任意单个字符(但不匹配换行符),加反斜杠会使它不再特殊。一对反斜杠配置一个真正的反斜杠。
简单的数量符
在模式中重复一些东西。号匹配前面的条目0次或多次。如:/foo\ttest/匹配在foo和test间任意数目的制表符。
.* 匹配任意字符、任意次数。
\+ 匹配前面的条目一次或多次。
? 匹配前面的条目是可选的,只能发生一次或0次(即没有)。
模式中的分组
可以用()括号分组,所以小括号也是元字符。如:
/abc+/ 匹配abccccccccccccccccc
/(abc)+/ 匹配abcabcabcabcabc
/(abc)*/ 匹配任意字符串,甚至是空串。
选择
竖线 | 表示要么是左侧匹配,要么是右侧匹配。此时读做“或”。
/aa|bb|cc|/ 匹配一个含有aa或bb或cc的字符串。
/aa( |\t)+bb/ 匹配aa和bb中间被空格、制表符或两者的混合串分隔
/aa( +|\t+)bb/ 匹配aa和bb中间必须全是空格,或全是制表符
/aa(and|or)bb/ 匹配aa and bb 和aa or bb
一个模式测试程序
下面这个程序有助于在一些字符串上测试一个模式,看看它匹配了什么,在哪里匹配的。
\#!/usr/bin/perl
while (<>) {
chomp;
if (/your_pattern_goes_here/) {
print "Matched : |$`<$&>$'|\n";
} else {
print "No match.\n";
}
};
第八章 正则表达式提高
字符类
字符类(character class)即在一对中括号中列出的所有字符,可以匹配类中的任何单个字符。例如:[abcdefg]可以匹配这七个字符中的任何一个。可用“-”指定一个范围。如[a-h],[1-9]等。[\001-\177]匹配任何7比特ASCII码。中括号中的“^”号是取反的意思,如[^abc]匹配除abc外的任何单个字符。
字符类快捷方式
有些字符类的使用特别频繁,所以就有了快捷方式。如:所有数字的字符类[0-9]可以缩写成\d,[A-Za-z0-9_]缩写成\w。\s匹配空白,它和[\f\t\n\r ]等同,即等同一个含五种空白字符的字符类,它们是换页符,制表符,换行符,回车符和空格字符自已。\s只匹配类中的一个字符,所以一般用\s*匹配任意数量的空白(包括没有空白),或用\s+匹配一个或多个空白字符。以上快捷方式的反置写法是用大写形式表示,\D,\W,\S。
/[\dA-Fa-f]/匹配十六进制数字。
/[\d\D]/匹配任何数字或任何非数字,也就是任何字符,包括换行符。“.”匹配除换行符外的所有字符。
/[^\d\D]/表示什么都不匹配。
通用数量符
前面我们见过三个数量符*,+,?。但如果这三个不能满足你的需要,也可以用大括号{}中的一对由逗号隔开的数字来指定重复的最少和最多次数。如/a{5,15}/匹配重复5次到15次的字母a。如果省略第二个数(但包含逗号),那么匹配的次数就没有上限。如/a{3,}/就匹配一行中连续出现的3个或多个a,它没有上限。如果连逗号也没有了,那么给出的数字就是一个准确的数字。如/a{3}/匹配3个a。
\* 等价 {0,}
\+ 等价 {1,}
? 等价 {0,1}
锚位符
锚位符(anchor)可以用来为模式指定字符串的特定位置。“^”标志字符串的开头,“$”标志字符串的结尾。如/^a/匹配处于字符头的abc,不能匹配dda,/b$/匹配处于字符尾的aab,不能匹配abc。
/^s*$/匹配一个空行
/^abc$/匹配abc,又匹配abc\n
单词锚位符
\b可以匹配一个单词的两端,可以用/\babc\b/来匹配单词abc。
可以用一个单词锚位符,如,/\bth/可以匹配this,these,但不匹配method。/er\b/匹配hander,woner,但不匹配gerenic,lery.
非单词边界锚位符是\B,它匹配任何\b不匹配的地方。如/\bsearch\B/会匹配searches,searching and searched.但不能匹配search or researching。
记忆的小括号
()可以用来把模式的一些部份组合起来,它还有第二个功能,它们要求正则表达式引擎记住与小括号中的模式匹配的那部份子串。
反向引用
反向引用(backreference)就是回头引用在当前模式处理过程中保存的记忆。用一个么斜杠来构成,如\1包含第一个正则表达式记忆。即被第一对小括号匹配的字符串部份。
反向引用被用来匹配与模式在前面匹配的字符串完全一样的字符串。所以/(.)\1/匹配任意单个字符,在记忆1中记住它,然后再与记忆1匹配。换句话说,它匹配任意字符,后跟同一个字符。这样,这个模式会匹配双字母式的字符串。如bamm-bamm和betty。它和/../不一样,/../匹配任意字符,后跟任意字符,它们两个可以一样,也可以不一样。
记忆变量
正则表达式记忆的内容在模式匹配结束后仍可通过特殊变量$1得到。
优先级
分四个级别
1、最上面的是小括号。 2、是数量符,*,+,?,{1,2},{1,},{1} 3、是锚位符和序列,^,$,\b,\B。 4、是坚线 | 。
优先级例子
/^aaa|bbb$/可能不程序员的意思,它只匹配字符串aaa的开头或字符串bbb的未尾。程序员更可能想要的是/^(aaa|bbb)$/,它匹配一行中没有其它东西,除了aaa或bbb以外。