本文向您展示了对常见Perl命令行参数应用的分析。内容简洁易懂,一定会让你眼前一亮。希望通过这篇文章的详细介绍,你能有所收获。
Perl命令行应用介绍
Perl有很多Perl命令行参数。通过它,我们有机会编写更简单的程序。在本文中,我们将了解一些常用的参数。
SafetyNetOptions
当使用Perl尝试一些聪明(或愚蠢)的想法时,不可避免地会出错。有经验的Perl程序员经常使用三个参数来提前找出错误。
-C是* * *。这个参数编译perl程序,但并不真正运行它。它检查所有语法错误。每次修改Perl程序后,我都会立即使用它来查找任何语法错误。
代码:
$perl-cprogram.pl
-W是第二个参数。它会提示你任何潜在的问题。5.6.0之后的Perl版本已经使用了警告;已替换-W .您应该使用usewarnings,因为它比-W更灵活.
-T是第三个参数。它将perl置于tain模式。在这种模式下,Perl将质疑来自程序外部的任何数据。例如,从Perl命令行、外部文件或CGI程序中读取的数据将在-T模式下被污染。
TED数据不能用来和外界互动。例如,使用系统调用中使用的文件名并打开。在perlsec文档中有更多关于什么数据会被污染的例子。
如果你想使用污点数据,你需要污点数据。污点是通过正则表达式实现的。这里我不会过多谈论污点模式。如果你想写的程序(比如CGI程序)需要接收用户不可知的输入,我推荐污点模式。
-d,perldefood,这里值得一提,但我们不能处理它。我建议阅读文档‘perldocperdebug’或RichardFoley的PerlDebuggerPocketReference。
Command-LinePrograms
下列Perl参数可以使简短的Perl程序在Perl命令行上运行。-e可以让Perl程序在Perl命令行上运行。例如,我们可以在Perl命令行上运行“HelloWorld”程序,而无需将其写入文件。
代码:
$perl-e'print'HelloWorld\n '
Multiple -e也可以同时使用,运行顺序取决于它出现的位置。
代码:
$ perl-e ' print ' hello ';-电子版《世界》
像所有的Perl程序一样,只需要程序的* * *行不需要用;结束。
虽然您也可以像往常一样引用模块,-M使它更容易。
代码:
$ perl-mlwp :3360 simple-e ' print ' http://www . example.com '
-M模块名与使用模块名相同。如果不想引入模块的默认值,可以使用-m-m模块名称与使用模块名称()相同。例如,在下面的示例中,由于默认情况下引入了head函数,所以在使用-m时不会使用它,导致没有输出。
代码:
$ perl-mlwp :3360 simple-e ' print ' http://www . example.com '
-m和-M使用=来介绍一个模块的特殊功能。
代码:
$ perl-MCGI=: standard-e ' print header '
这里介绍了CGI.pm的‘: standard’,可以使用表头功能。可以使用引号和逗号引入多个参数。
代码:
$perl-MCGI='header,start_html'-e'printheader,start_html '
这里我们介绍一下header和start_html函数。
ImplicitLoops
-n和-p增加了循环的功能,这样就可以逐行处理文件了。
代码:
$perl-n-e'somecode '文件1
这与以下程序相同。
代码:
管线:
while(){ 0
#你的代码在这里
}
;在Perl命令行中打开文件,并逐行读取。默认情况下,每行都保存在$ _中。
代码:
$perl-n-e'print'$。-$_ ' '文件
上面一行可以写成
代码:
管线:
while(){ 0
打印' $。-$_quot
;
}
输出当前行数$.和当前行$_.
-p可以让上面的程序变得更容易.-p会输出$_就像这样
CODE:
LINE:
while(<>){ #yourcodegoeshere }continue{ printordie"-pdestination:$!\n"; }
continue在这里保证print在每次循环都会被调用.
使用-p,我们的打印行数程序可以改为
CODE:
$perl-p-e'$_="$.-$_"'
注意到那个LINE:标签?我们可以利用它来跳到下一个循环.使用nextLINE
CODE:
$perl-n-e'nextLINEunless/pattern/;print$_'
如果想在循环的前后做些处理,可以使用BEGIN或ENDblock.下面的这一行计算文件里的字数.
CODE:
$perl-ne'END{print$t}@w=/(\w+)/g;$t+=@w'file.txt
每一行所有匹配的字放入数组@w,然后把@w的元素数目递加到$t.ENDblock里的print***输出文件总字数.
还有两个参数可以让这个程序变得更简单.-a打开自动分离(split)模式.空格是缺省的分离号.输入根据分离号被分离然后放入缺省数组@F.由此,我们可以把上面的程序改写为
CODE:
$perl-ane'END{print$x}$x+=@F'file.txt
你也可以通过-F把缺省的分离号改为你想要的.例如把分离号定为非字符:
CODE:
$perl-F'\W'-ane'END{print$x}$x+=@F'file.txt
下面通过Unixpassword文件来介绍一个复杂的例子.Unixpassword是文本文件,每一行是一个用户记录,由冒号:分离.第7行是用户的登录shell路径.我们可以得出每一个不同shell路径被多少个用户使用:
CODE:
$perl-F':'-ane'$s{$F[6]}++;'\
>;-e'END{print"$_:$s{$_}"forkeys%s}'/etc/passwd
虽然现在不是一行,但是你可以看出使用参数可以解决什么问题.
RecordSeparators
以前我提到过$/和$\--输入,输出分隔号.$/用来分隔从文件句柄里读出的数据,缺省$/分隔号是\n,这样每次从文件句柄里就会一行行的读取.$\缺省是空字符,用来自动加到要print的数据尾端.这就是为什么很多时候print都要在末尾加上\n.
$/和$\可与-n-p一起使用.在Perl命令行上相对应为-0(零)和-l(这是L).-0后面可以跟一个16进制或8进制数值,若是16进制数,需要使用前缀x.这个值用来付给$/.-0表示以null字符串作为分格符,-00打开段落模式,-0777打开slurp模式(即可以一次把整个文件读入),这与把$/设为空字符和undef一样效果.
单独使用-l有两个效果,***自动chomp输入分隔号,第二把$/值付给$\(这样print的时候就会自动在末尾加\n)
我个人常常使用-l参数,用来给每一个输出加\n.例如
CODE:
$perl-le'print"HelloWorld"'
In-PlaceEditing
使用已有的参数我们可以写出很有效的Perl命令行程序.常见的UnixI/O重定向:
CODE:
$perl-pe'somecode'<input.txt>output.txt
这个程序从input.txt读取数据,然后做一些处理再输出到output.txt.你当然也可以把输出重定向到同一个文件里.
上面的程序可以通过-i参数做的更简单些.
-i把源文件更名然后从这个更名的源文件里读取.***把处理后的数据写入源文件.如果-i后跟有其他字符串,这个字符串与源文件名合成后来生成一个新的文件名.此文件会被用来储存原始文件以免被-i参数覆盖.
注意:使用-i参数后,文件将作为程序的标准输出,所以必须使用-p参数,或者程序里要包含print等输出语法,不然文件将为空.
这个例子把所有php字符替换为perl:
CODE:
$perl-i-pe's/\bPHP\b/Perl/g'file.txt
程序读取文件的每一行,然后替换字符,处理后的数据重新写入(即覆盖)源文件.如果不想覆盖源文件,可以使用
CODE:
$perl-i.bak-pe's/\bPHP\b/Perl/g'file.txt
这里处理过的数据写入file.txt,file.txt.bak是源文件的备份.
上述内容就是常用Perl命令行参数应用的分析,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/84209.html