perl one line

来源:互联网 发布:局域网 ip 端口号 编辑:程序博客网 时间:2024/06/01 13:48
不知道有人转贴过无
http://www.wgaky.com/index.php/archives/41


[原创]Perl One Line By Example
Perl常用命令行参数概览
-e 指定字符串以作为脚本(多个字符串迭加)执行
-M/-m 和 use 模块名 一样. 如果不想引入模块的缺省值, 你可以使用 -m. -m模块名 和 use 模块名() 一样.
-I 指定目录以搜索标准位置前的模块
-w 打开警告
-c 进行语法检查但并不执行程序。
-0 (这是个零)跟一个16 进制或8进制数值,指定输入记录分隔符
-l (这个是L)跟一个16 进制或8进制数值,指定输出记录分隔符
-a 打开自动分离 (split) 模式. 空格是缺省的分离号. 输入根据分离号被分离然后放入缺省数组 @F.
-F 指定分割符 -a 使用的模式
-i 在适当的位置编辑文件
-n 使用 <> 将所有 @ARGV 参数当作文件来逐个运行
-p 和 -n 一样,但是还会打印 $_ 的内容
-00 打开段落模式
-0777 打开slurp 模式 (即可以一次把整个文件读入) , 这与把 $/ 设为空字符和 undef 一样效果.
-l 单独使用,有两个效果, 第一自动 chomp 输入分隔号, 第二 把$/ 值付给 $\ ( 这样 print 的时候就会自动在末尾加 \n )
好的,上边我们给出了perl one line 中最常用的几个参数,看完之后你可能一头雾水,不过没关系,接下来我们会逐一用示例代码演示如果使用这个参数来使你的日常工作变得更轻松。在文末的附录中我将给出一个详细的参数列表和相关的环境变量列表以供参考。
-c
这个参数编译 Perl 程序但不会真正运行它. 由此检查所有语法错误.事实上,它会执行任何BEGIN或CHECK块以及任何use指示字。
示例:
[32 michael@09:44:17 ~]$ perl -c pr/Perl/Code/gupiao.pl
pr/Perl/Code/gupiao.pl syntax OK
-w
打开警告,报告任何潜在的问题。例如只提到到过一次的变量,子例程的重定义等。
示例:
[33 michael@10:17:16 ~]$ perl -w -e’print $foo’
Name “main::foo” used only once: possible typo at -e line 1.
Use of uninitialized value in print at -e line 1.
-e
用于输入一行或多行脚本。如果使用了-e,Perl将不会在参数列表中寻找程序的文件名。
例如:
[34 michael@10:17:17 ~]$ perl -e’print “Hello world!\n”‘
Hello world! <—你的perl one line的hello world诞生了。
-M/-m
用于导入模块。就像执行use那样。如果你指定的是-MODULE,而不是MODULE,那么它将执行no。例如,-Mstrict类似use strict;而-M-strict类似no strict。
示例:
[38 michael@10:29:03 ~]$ perl -MLWP::Simple -e ‘print head “http://www.sina.con.cn”;print “\n”‘
text/html615Microsoft-IIS/6.0
-m和-M 通过=来引入某个模块的特别函数.
示例:
[48 michael@10:41:40 ~]$ perl -MCGI=:standard -e ‘print header’
Content-Type: text/html; charset=ISO-8859-1
事实上当你使用-Mmodule=’foo,bar’时,你实际上是在说-M’module qw(foo bar)’
示例:
[49 michael@10:42:37 ~]$ perl -MCGI=’header,start_html’ -e ‘print header, start_html’
Content-Type: text/html; charset=ISO-8859-1<!DOCTYPE html
PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml” lang=”en-US” xml:lang=”en-US”>
<head>
<title>Untitled Document</title>
<meta http-equiv=”Content-Type” content=”text/html; charset=iso-8859-1″ />
</head>
<body>
-n/-p
增加了循环的功能, 使你可以一行一行来处理文件.
-n实际上相当于如下的perl代码段:
LINE:
while (<>;) {
# your code goes here
}
而-p相当于:
LINE:
while (<>;) {
# your code goes here
} continue {
print or die “-p destination: $!\n”;
}
正如你在等价代码中看到的,使用-p时,每一行都会被打印出来。
示例:
[52 michael@10:52:42 ~]$ perl -ne’print “$.—$_”‘ pr/C/helloword.c <—正如你在结果中看到的,它将输出每一行的行号与该行内容。
1—#include<stdio.h>
2—
3—int main(void)
4—{
5— printf(“Hello world!\n”);
6— return 0;
7—}
示例:
[140 michael@12:57:07 ~]$ perl -ne ‘print if 30 .. 35′ pr/Perl/Code/gupiao.pl <–打印指定文件中的30到35行
if($infot eq “op”){$op=$infoc}
if($infot eq “hi”){$hi=$infoc}
if($infot eq “lo”){$lo=$infoc}
if($infot eq “cp”){$cp=$infoc}
if($infot eq “lname”){$lname=$infoc}
if ($infot eq “type”)
注意到那个 LINE: 标签了么?我们可以利用它来跳到下一个循环. 使用 next LINE
示例:
[53 michael@10:53:49 ~]$ perl -ne’next LINE unless /main/;print “$.—$_”‘ pr/C/helloword.c
3—int main(void)
如果想在循环的前后做些处理, 可以使用 BEGIN 或 END block.
示例:
[57 michael@10:58:39 ~]$ perl -ne ‘END { print “$t\n” } @w = split; $t += @w’ pr/C/helloword.c
9 <—在END中输出该文件中的字数。
-a
打开自动分割模式,不过只有在和-p/-n一起使用时才有效。在-n/-p开关生成的while循环中首先对@F数组进行一次隐含的split调用。空格是缺省的分离号. 输入根据分离号被分离然后放入缺省数组 @F. 因此,前一个统计字数的代码可以更简单的写成如下模式:
[58 michael@11:04:26 ~]$ perl -ane ‘END {print “$x\n”} $x += @F’ pr/C/helloword.c
9
-F
指定通过-a开关(否则没有作用)自动split时使用的分割符。比如,当我们处理/etc/passwd文件时,分割符为:
示例:
[63 michael@11:10:25 ~]$ perl -F: -ane ‘print if $F[6] && $F[6] =~ m(^/bin/bash$)’ /etc/passwd
root:x:0:0:root:/root:/bin/bash
michael:x:500:500::/home/michael:/bin/bash
nagios:x:501:501::/home/nagios:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
-0
把记录分割符($/)指定为一个八进制数字。如果没有提供,那么NUL字符就是分割符。-00允许Perl以段落模式打开文件。-0777打开slurp 模式 (即可以一次把整个文件读入) , 这与把 $/ 设为空字符和 undef 一样效果.如果要处理的文件很大的话,不建议这么做,因为一次性将文件读入内存会占用大量内存空间。
-l
打开自动行结束处理,它有两个效果:首先,如果和-n/-p一起使用,自动chomp行终止符,其次,它把$\设置为紧随-l参数厚的一个八进制数代表的字符,如果省略,-l就把$\设置为$/的当前值,通常为换行符。
示例:
[65 michael@12:23:04 ~]$ perl -le’print “Hello world!”‘
Hello world!
看到了?我们不用每次再在print之后附上一个\n,很不错的选择,不是么?
-i
-i 把源文件更名然后从这个更名的源文件里读取.最后把处理后的数据写入源文件. 如果 -i 后跟有其他字符串, 这个字符串与源文件名合成后来生成一个新的文件名. 此文件会被用来储存原始文件以免被 -i 参数覆盖.
示例:
[124 michael@12:36:33 ~/show]$ ls
file1
[125 michael@12:36:35 ~/show]$ cat file1
PHP
[126 michael@12:36:38 ~/show]$ perl -pi -e’s/PHP/Perl/g’ file1 <–由于我们没有给-i指定字符串,因此源文件被覆盖
[127 michael@12:36:44 ~/show]$ ls
file1
[128 michael@12:36:47 ~/show]$ cat file1
Perl
示例:
[131 michael@12:38:10 ~/show]$ ls
file1
[132 michael@12:38:10 ~/show]$ cat file1
PHP
[133 michael@12:38:12 ~/show]$ perl -pi.bak -e’s/PHP/Perl/g’ file1 <—我们为-i指定了.bak,因此源文件被重命名为file1.bak
[134 michael@12:38:20 ~/show]$ ls
file1 file1.bak
[135 michael@12:38:21 ~/show]$ cat file1
Perl
[136 michael@12:38:24 ~/show]$ cat file1.bak
PHP


Tom Christiansen先生的perl1line完整列表
http://download.boulder.ibm.com/ ... ary/l-p102/tomc.txt

IBM DW上的perl1line:
功能丰富的 Perl:一行程序 101 - Perl 作为命令行实用程序
http://www.ibm.com/developerWorks/cn/linux/sdk/perl/l-p101/

功能丰富的 Perl:一行程序 102
http://www.ibm.com/developerwork ... l/l-p102/index.html


perl1ine英文注释版
http://www.catonmat.net/blog/perl-one-liners-explained-part-one/

http://www.catonmat.net/blog/perl-one-liners-explained-part-two/

http://www.catonmat.net/blog/perl-one-liners-explained-part-three/

原创粉丝点击