有如下输出:
/usr/sbin/nologin : 3
/bin/sh : 18
/bin/sync : 1
/bin/bash : 2
/bin/false : 9
数据分隔符
我以前的文章里提到过 $/ 和 $—输入,输出分隔号。$/ 用来分隔从文件句柄里读出的数据,缺省 $/ 分隔号是 n,这样每次从文件句柄里就会一行行的读取。$ 缺省是空字符,用来自动加到要 print 的数据尾端。这就是为什么很多时候 print 都要在末尾加上 n,$/ 和 $ 可与 -n -p 一起使用。在命令行上相对应为 -0 (零) 和 -l (这是 L)。-0 后面可以跟一个16 进制或8进制数值,这个值用来赋给 $/。-00 打开段落模式,-0777 打开slurp 模式(即可以一次把整个文件读入),这与把 $/ 设为空字符和 undef 一样效果。
单独使用 -l 有两个效果,第一自动 chomp 输入分隔号,第二 把$/ 值付给 $ (这样 print 的时候就会自动在末尾加 n)我个人常常使用 -l 参数,用来给每一个输出加 n,例如:
$ perl -le 'print "Hello World"'
原位编辑
使用已有的参数我们可以写出很有效的命令行程序. 常见的Unix I/O 重定向:
$ perl -pe 'some code' output.txt
这个程序从 input.txt 读取数据,然后做一些处理再输出到 output.txt. 你当然也可以把输出重定向到同一个文件里。上面的程序可以通过 -i 参数做的更简单些。-i 把源文件更名然后从这个更名的源文件里读取,最后把处理后的数据写入源文件。如果 -i 后跟有其他字符串,这个字符串与源文件名合成后来生成一个新的文件名,此文件会被用来储存原始文件以免被 -i 参数覆盖。
这个例子把所有php字符替换为perl :
$ perl -i -pe 's/bPHPb/Perl/g' file.txt
程序读取文件的每一行,然后替换字符,处理后的数据重新写入(即覆盖) 源文件. 如果不想覆盖源文件,可以使用$perl -i.bak -
pe 's/bPHPb/Perl/g' file.txt
这里处理过的数据写入 file.txt ,file.txt.bak 是源文件的备份。
打开Perl的taint模式
1、该程序的输入数据来自外部数据源。
2、该程序所调用sub-shell或者函数影响到该程序之外其它东西。
你可以用“-T”开关来打开Perl的taint模式。当打开taint模式时,Perl就会进行执行检查以确保你的数据未被taint,如果不安全的使用了被taint的数据,就会发出严重错误。为了使你的数据不被taint,执行正则表达式来匹配数据并提取匹配部分。这样你就必须描述出你所期望的数据的内容以及格式,并只接受符合这一要求的数据。
例如,假设你期望收到一个单词字符(word characters,即字母数字以及下划线),那么下面的代码通过一个正则表达式(它只通过全部由单词字符组成字符串)会“蒸馏出”你的数据来:









