在读入文本时,第二个解释用途不大。如果你正在读的段落出现上述情况,你不必过滤出“空”段落。
$/ = "\n\n";
while (<FH>) {
chomp;
next unless length; # 跳过空段
# ...
}
你可以把 $/设置为undef,它用于读入后面跟着两个或多个换行符组成的段落: undef $/;
while (<FH>) {
chomp;
# ...
}
读入整个文件
$/ 的其它有趣的值为undef。如果设置为该值,就将告诉Perl,读命令将把文件的剩余部分作为一个串返回:
undef $/;
$file = <FH>;
因为改变了 $/的值,将会影响以后的每次读操作,而不仅是下一个读操作。通常,你需要将该操作限制在局部。通过下面的例子,可以把文件句柄的内容读入到一个串中:
{
local $/ = undef;
$file = <FH>;
}
记住:Perl变量可读入很长的串。尽管你的文件大小不可以超出你的虚拟
内存容量的限度,你仍可以读入尽可能多的数据。
用
正则表达式对文件进行操作
一旦你有个包含了整个串的变量,你可以使用正则表达式,对整个文件进行操作,而不是对文件中的某个块进行操作。有两个有用的正则表达式标记/s和/m。一般,Perl的正则表达式对行进行处理,你可以这样写:
undef $/;
$line = <FH>;
if ($line =~ /(b.*grass)$/) {
print "found $1\n";
}
如果把我们的文件填入如下内容:
browngrass
bluegrass
则输出为:
found bluegrass
它没有找到“browngrass”,这是因为$ 仅在串尾寻找其匹配, (或者在串结束前的一行)。如果在包含很多行的串中,用"^" 和"$" 来匹配,, 我们可以使用 /m ("multiline") 选项:
if ($line =~ /(b.*grass)$/m) {}
现在程序会把如下的信息输出:
found browngrass
类似地,句点可以匹配除了换行符之外的所有字符:
while (<FH>) {
if (/19(.*)$/) {
if ($1 < 20) {
$year = 2000+$1;
} else {
$year = 1900+$1;
}
}
}
如果我们从文件中读入“1981”,$_ 将包含“1981\n”。正则表达式中的句点匹配“8”和“1”, 而不匹配“\n”。这里正需要这样做,因为换行符不是日期的组成部分。
共7页 第1页 第2页 第3页 第4页 第5页 第6页 第7页