这里我们引入了 header 和 start_html 函数。
Implicit Loops
-n 和 -p 增加了循环的功能,使你可以一行一行来处理文件。
$ perl -n -e 'some code' file1
这与下面的程序一样.
LINE:
while () {
# your code goes here
}
注意:打开命令行里的文件,一行行的读取,每一行将缺省保存在 $_。
$ perl -n -e 'print "$. - $_"' file
上面的这一行可以写成 LINE: while () { print ”$. – $_” } 输出当前行数 $. 和当前行 $_,-p可以让上面的程序变得更容易,-p 会输出 $_ 的内容,就像这样:
while () {
# your code goes here
} continue {
print or die "-p destination: $!n";
}
continue 在这里保证 print 在每次循环都会被调用。使用 -p,我们的打印行数程序可以改为
$ perl -p -e '$_ = "$. - $_"' filename
这种情况下我们就不需要要明确地调用 print 函数了,因为 -p 选项已经调用了它。注意,LINE: 标签可以让我们直接跳到下一个输入记录,而不管你进入了多少层循环,使用 next LINE。
$ perl -n -e 'next LINE unless /pattern/; print $_'
当然,也可以这样写:
$ perl -n -e 'print unless /pattern/'
在更复杂的情况里,next LINE可以让你的代码更容易理解。如果想在循环的前后做些处理,可以使用 BEGIN或END block,下面的这一行代码可以计算 text 文件里的字数:
$ perl -ne 'END { print $t } @w = /(w+)/g; $t += @w' file.txt
每一行所有匹配的字放入数组 @w,然后把 @w 的元素数目递加到$t,END block 里的 print 最后输出文件总字数。
还有两个参数可以让这个程序变得更简单,-a 打开自动分离 (split) 模式,空格是缺省的分离号,输入根据分离号被分离然后放入缺省数组 @F。由此,我们可以把上面的程序改写为:
$ perl -ane 'END {print $x} $x += @F' file.txt
你也可以通过 -F 把缺省的分离号改为你想要的.例如把分离号定为非字符:
$ perl -F'W' -ane 'END {print $x} $x += @F' file.txt
下面通过 Unix password 文件来介绍一个复杂的例子。Unix password 是文本文件,每一行是一个用户记录,由冒号 ':'分离。第6列是用户的登录 shell 路径,我们可以得出每一个不同 shell 路径被多少个用户使用:
$ perl -F':' -ane 'chomp($F[6]); $s{$F[6]}++; END{print"$_:$s{$_}n" for keys %s}' /etc/passwd
$ perl -F':' -alne '$s{$F[6]}++;' -e 'END { foreach (keys %s){chomp($_);print "$_ : $s{$_}"} }' /etc/passwd









