加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl命令行应用介绍

发布时间:2020-12-15 20:57:52 所属栏目:大数据 来源:网络整理
导读:Perl?有很多命令行参数.?通过它,?我们有机会写出更简单的程序.?在这篇文章里我们来了解一些常用的参数. (重点提示:在window下执行命令行程序的方式为?: perl -e " some code " ,注意:是双引号啊,不是单引号,linux下执行时单引号 ) Safety?Net?Options

Perl?有很多命令行参数.?通过它,?我们有机会写出更简单的程序.?在这篇文章里我们来了解一些常用的参数.

(重点提示:在window下执行命令行程序的方式为?: perl -e "some code",注意:是双引号啊,不是单引号,linux下执行时单引号


Safety?Net?Options

在使用?Perl?尝试一些聪明(?或?stupid)?的想法时,?错误难免会发生.?有经验的?Perl?程序员常常使用三个参数来提前找到错误所在,?

-C?是第一个.?这个参数编译?Perl?程序但不会真正运行它.?由此检查所有语法错误.?每次修改?perl?程序之后我都会立刻使用它来找到任何语法错误.

???

$?perl?-c?program.pl



-W?是第二个参数.?它会提示你任何潜在的问题.?Perl?5.6.0?之后的版本已经用?use?warnings;?替换了?-w?.你应该使用?use?warnings?因为它要比?-w?更灵活.

-T?是第三个参数.?它把?perl?放到了?tain?模式.??在这个模式里,?Perl?会质疑任何程序外传来的数据.?例如,从命令行读取,?外部文件里读取?或是?CGI?程序里传来的数据.?这些数据在?-T?模式里都会被?Tainted?掉.

Tainted?数据不可以被用来和外部交互.?例如?使用在?system?调用和用作?open?的文件名.?perlsec?文档里有更多什么数据会被Tainted?掉的例子.

要想使用?Tainted?的数据就需要?untaint这个数据.?untaint?是通过正则表达式来实现.这里我不会太多的讲述?taint?模式.?如果你要编写的程序?(例如?CGI?程序)?需要从从用户那里接受不可知的输入,?我推荐使有?taint?模式

-d?,Perl?Debugger?,?在这里值得一提但我们无法顾及,?我推荐阅读文档?'perldoc?perldebug'?或?Richard?Foley?的?Perl?Debugger?Pocket?Reference?一书.

Command-Line?Programs

下面的几个?Perl?参数可以让短小的?Perl?程序运行在命令行.?-e?可以让?Perl?程序在命令行上运行.例如,?我们可以在命令行上运行?"Hello?World"?程序而不用把它写入文件再运行.

??

$?perl?-e?'print?"Hello?World/n"'



多个?-e?也可以同时使用,?运行顺序根据它出现的位置.

??

$?perl?-e?'print?"Hello?";'?-e?'print?"World/n"'


象所有的?Perl?程序一样,?只有程序的最后一行不需要以?;?结尾.

虽然你也可以象通常一样引用模块,?但?-M?让它变得更容易.

??$?perl?-MLWP::Simple?-e?'print?head?"http://www.example.com"'



-M模块名?和?use?模块名?一样.?如果不想引入模块的缺省值,?你可以使用?-m.?-m模块名?和?use?模块名()?一样.?例如下面这个例子,?因为?head?函数是缺省引入,而使用?-m?时就不会,?结果是没有输出.

??$?perl?-mLWP::Simple?-e?'print?head?"http://www.example.com"'



-m?和?-M?通过?=?来引入某个模块的特别函数.

?

?$?perl?-MCGI=:standard?-e?'print?header'



这里,?CGI.pm?的?":standard"?被引入,?header?函数因此可以使用.要引入多个参数可以通过使用引号和逗号.

??

$?perl?-MCGI='header,start_html'?-e?'print?header,?start_html'



这里我们引入了?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?会输出?$_?就像这样?

??

LINE:

????while?(<>;)?{
??????#?your?code?goes?here
????}?continue?{
??????print?or?die?"-p?destination:?$!/n";
????}



continue?在这里保证print?在每次循环都会被调用.

使用?-p,?我们的打印行数程序可以改为

??$?perl?-p?-e?'$_?=?"$.?-?$_"'



注意到那个?LINE:?标签???我们可以利用它来跳到下一个循环.?使用?next?LINE


??$?perl?-n?-e?'next?LINE?unless?/pattern/;?print?$_'



如果想在循环的前后做些处理,?可以使用?BEGIN?或?END?block.?下面的这一行计算文件里的字数.

??$?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?是文本文件,?每一行是一个用户记录,?由冒号?:?分离.?第?7?行是用户的登录?shell?路径.?我们可以得出每一个不同?shell?路径被多少个用户使用?:

??$?perl?-F':'?-ane?'$s{$F[6]}++;'?/

??>;?-e?'END?{?print?"$_?:?$s{$_}"?for?keys?%s?}'?/etc/passwd



虽然现在不是一行,?但是你可以看出使用参数可以解决什么问题.

Record?Separators

以前我提到过?$/?和?$/?--?输入,输出分隔号.?$/?用来分隔从文件句柄里读出的数据,?缺省?$/?分隔号是?/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"'



[size=18]In-Place?Editing[/size]

使用已有的参数我们可以写出很有效的命令行程序.?常见的Unix?I/O?重定向:

?

?$?perl?-pe?'some?code'?<?input.txt?>;?output.txt



这个程序从?input.txt?读取数据,?然后做一些处理再输出到?output.txt.?你当然也可以把输出重定向到同一个文件里.

上面的程序可以通过?-i?参数做的更简单些.?-i??把源文件更名然后从这个更名的源文件里读取.最后把处理后的数据写入源文件.?如果?-i?后跟有其他字符串,?这个字符串与源文件名合成后来生成一个新的文件名.?此文件会被用来储存原始文件以免被?-i??参数覆盖.?

这个例子把所有?php?字符替换为?perl?:

??

$?perl?-i?-pe?'s//bPHP/b/Perl/g'?file.txt



程序读取文件的每一行,?然后替换字符,?处理后的数据重新写入(?即覆盖?)?源文件.?如果不想覆盖源文件,?可以使用

??

$perl?-i.bak?-pe?'s//bPHP/b/Perl/g'?file.txt

这里处理过的数据写入?file.txt?,?file.txt.bak?是源文件的备份.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读