选择显示字体大小

perl命令行应用介绍

译者/作者:qiang

出处:中国perl协会 fpc(foundation of perlchina)

作者:dave cross

原名:perl command-line options

原文:http://www.perl.com/pub/a/2004/08/09/commandline.html

perl 有很多命令行参数。通过它可以让你的程序更简练,并且可以写出很多只有一行命令的perl。在这篇文章里我们来了解一些常用的命令行参数。

安全网参数

有三个参数我认为可以起到“安全网”的作用,因为它们可以让你避免犯错,特别是当你在使用 perl 尝试一些特别聪明(或这愚蠢)的想法时, 错误难免会发生。有经验的 perl 程序员常常使用这三个参数来提前找到错误所在。

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

$ perl -c program.pl
这保证了程序依然可以编译。很显然,当你输入一小段代码之后立即进行检查,比起一下子输入几百行代码然后开始 debug 要容易很多。

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

-t 是第三个参数。它让 perl 出于了 taint 模式中。在这个模式里,perl 会质疑任何程序外传来的数据。例如,从命令行读取,外部文件里读取 或是 cgi 程序里传来的数据。这些数据在 -t 模式里都会被 tainted(污染)。

tainted 数据不可以被用来和外部交互。例如 使用在 system 调用和用作 open 的文件名。关于什么数据会被tainted,请参阅perlsec 文档,那里有一个完整的列表。

要想使用 tainted 的数据就必须 untaint这个数据。untaint 是通过正则表达式来实现的,关于 taint 本身的内容足够写一篇单独的文章,所以这里我不会太多的讲述 taint 模式。如果你要编写的程序(例如 cgi 程序)需要从从用户那里接受不可知的输入,我推荐使有 taint 模式

还有一个值得一提的参数是 -d,它将让 perl 处于 debugger 模式。这个话题内容非常多,我推荐阅读文档 ‘perldoc perldebug’ 或 richard foley 的 perl debugger pocket reference 一书.

command-line programs

下面的几个 perl 参数可以让短小的 perl 程序很容易的在命令行上运行。-e 可以让 perl 代码在命令行上被编译器直接执行.例如, 我们可以直接在命令行上运行 “hello world” 程序而不用把它写称 perl 程序。
$ perl -e 'print "hello world\n"'
多个 -e 也可以同时使用, 运行顺序根据它出现的位置.
$ perl -e 'print "hello ";' -e 'print "world\n"'
象所有的 perl 程序一样, 只有程序的最后一行不需要以 ; 结尾.

虽然你也可以用 -e 来引用模块, 但 -m 让它变得更容易.

$ perl -mlwp::simple -e 'print head "http://www.example.com"'
-m模块名 和 use 模块名 一样。有些模块有默认的模块导入,如果你不想导入它们,你可以使用 -m。-m模块名 和 use module() 一样,关闭了默认的导入。例如下面这个例子, 因为 head 函数是默认导入,而使用 -m 时就不会执行,结果是没有输出。
$ perl -mlwp::simple -e 'print head "http://www.example.com"'
-m 和 -m 有很多方便的语法来帮助你使用它们,你可以在 = 后面列出对 use 的各种参数。
$ 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    }
注意: <> 打开命令行里的文件,一行行的读取。每一行将缺省保存在 &#36;_
&#36; perl -n -e 'print "&#36;. - &#36;_"' file
上面的这一行可以写成 line: while (<>) { print ”&#36;. – &#36;_” } 输出当前行数 &#36;. 和当前行 &#36;_.

-p 可以让上面的程序变得更容易.-p 会输出 &#36;_ 的内容,就像这样:

  line:    while (<>) {      # your code goes here    } continue {      print or die "-p destination: &#36;!\n";    }
continue 在这里保证 print 在每次循环都会被调用。

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

&#36; perl -p -e '&#36;_ = "&#36;. - &#36;_"'
这种情况下我们就不需要要明确地调用 print 函数了,因为 -p 选项已经调用了它。

注意, line: 标签可以让我们直接跳到下一个输入记录,而不管你进入了多少层循环。使用 next line。

&#36; perl -n -e 'next line unless /pattern/; print &#36;_'
当然,也可以这样写:
&#36; perl -n -e 'print unless /pattern/'
在更复杂的情况里, next line 可以让你的代码更容易理解。

如果想在循环的前后做些处理,可以使用 begin 或 end block. 下面的这一行代码可以计算 text 文件里的字数。

&#36; perl -ne 'end { print &#36;t } @w = /(\w+)/g; &#36;t += @w' file.txt
每一行所有匹配的字放入数组 @w,然后把 @w 的元素数目递加到 &#36;t。end block 里的 print 最后输出文件总字数。

还有两个参数可以让这个程序变得更简单。-a 打开自动分离 (split) 模式。空格是缺省的分离号。输入根据分离号被分离然后放入缺省数组 @f。由此,我们可以把上面的程序改写为

&#36; perl -ane 'end {print &#36;x} &#36;x += @f' file.txt
你也可以通过 -f 把缺省的分离号改为你想要的.例如把分离号定为非字符:
&#36; perl -f'\w' -ane 'end {print &#36;x} &#36;x += @f' file.txt
下面通过 unix password 文件来介绍一个复杂的例子。unix password 是文本文件,每一行是一个用户记录,由冒号 :分离。 第?行是用户的登录 shell 路径。我们可以得出每一个不同 shell 路径被多少个用户使用:
&#36; perl -f':' -ane '&#36;s{&#36;f[6]}++;' > -e 'end { print "&#36;_ : &#36;s{&#36;_}" for keys &#37;s }' /etc/passwd
虽然现在不是一行,但是你可以看出使用参数可以解决什么问题。

数据分隔符

我以前的文章里提到过 &#36;/ 和 &#36;\—输入,输出分隔号。&#36;/ 用来分隔从文件句柄里读出的数据,缺省 &#36;/ 分隔号是 \n,这样每次从文件句柄里就会一行行的读取。 &#36;\ 缺省是空字符,用来自动加到要 print 的数据尾端。这就是为什么很多时候 print 都要在末尾加上 \n。

&#36;/ 和 &#36;\ 可与 -n -p 一起使用。在命令行上相对应为 -0 (零) 和 -l ( 这是 l )。-0 后面可以跟一个16 进制或8进制数值,这个值用来赋给 &#36;/。-00 打开段落模式,-0777 打开slurp 模式 (即可以一次把整个文件读入),这与把 &#36;/ 设为空字符和 undef 一样效果。

单独使用 -l 有两个效果,第一自动 chomp 输入分隔号,第二 把&#36;/ 值付给 &#36;\ ( 这样 print 的时候就会自动在末尾加 \n )

我个人常常使用 -l 参数, 用来给每一个输出加 \n. 例如

&#36; perl -le 'print "hello world"'

原位编辑

使用已有的参数我们可以写出很有效的命令行程序. 常见的unix i/o 重定向:
&#36; perl -pe 'some code' < input.txt > output.txt
这个程序从 input.txt 读取数据, 然后做一些处理再输出到 output.txt. 你当然也可以把输出重定向到同一个文件里. 上面的程序可以通过 -i 参数做的更简单些。-i 把源文件更名然后从这个更名的源文件里读取。最后把处理后的数据写入源文件。如果 -i 后跟有其他字符串,这个字符串与源文件名合成后来生成一个新的文件名。此文件会被用来储存原始文件以免被 -i 参数覆盖。

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

&#36; perl -i -pe 's/\bphp\b/perl/g' file.txt
程序读取文件的每一行, 然后替换字符, 处理后的数据重新写入( 即覆盖 ) 源文件. 如果不想覆盖源文件, 可以使用
&#36;perl -i.bak -pe 's/\bphp\b/perl/g' file.txt
这里处理过的数据写入 file.txt , file.txt.bak 是源文件的备份.

更多信息

perl 有大量的命令行参数,这篇文章只是列举了最有用的一小部分。更详细的信息请参考 “perlrun” 文档。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons