Perl命令行应用程序详解

2019-10-01 10:56:45刘景俊

这里我们引入了 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