Perl命令行参数
- 格式:doc
- 大小:47.00 KB
- 文档页数:5
Perl的经典用法<编者按:本月的专栏文章将介绍一些Perl的经典用法,以便帮助你创建短小精悍,可靠性更高的程序>perl复制文件夹use File::Copy qw(cp);cp"/dira/dfsdf","/dirb/sdfsdf/dddddd";我用system('cp source target'),如果我把程序移植到WINDOWS能否正确运行?use File::Copy;copy($original,$new_copy)or die"Copy failed:$!";学Perl有几本书要常备:1.Programming Perl2.Perl Cookbook3.Perl FAQ打印数据的方法:一:print"@array\n";二:for$row(@array){print"@$row\n";}三:for$row(0..$#array){print"row$row is:@{$geno_sample[$row]}\n";}用Open()函数打开文件打开文件的常用方法是:open(FH,"<$filename")or die"Couldn't open$filename for reading:$!";open()函数通常带有两个参数,第一个为文件句柄,用于指向打开的文件,第二个参数是文件名及模式(文件的打开模式)的混合体,如果文件被成功打开,open()函数返回true,否则为false。
我们用“or”来测试该条件。
上述代码中的模式由小于字符(<)来表示。
如果文件不存在,open()将返回false。
此时,你可以读文件句柄,但不可以写。
大于字符表示写。
如果文件不存在,就会被创建。
如果文件存在,文件被清除,以前的数据将会丢失。
Perl的命令⾏参数和ARGV程序名:$0$0表⽰当前正在运⾏的Perl脚本名。
有3种情况:如果执⾏⽅式为perl x.pl,则$0的值为x.pl⽽⾮perl命令本⾝如果执⾏⽅式为./x.pl,则$0的值为./x.pl如果执⾏的是perl -e或perl -E⼀⾏式perl程序,则$0的值为-e或-E命令⾏参数ARGVperl将perl命令⾏的参数列表放进数组ARGV(@ARGV)中。
既然是数组,就可以访问($ARGV[n])、遍历,甚⾄修改数组元素ARGV数组分三种情况收集:perl x.pl a b c⽅式运⾏时,脚本名x.pl之后的a b c才会被收集到ARGV数组./x.pl a b c⽅式运⾏时,a b c才会被收集到ARGV数组perl -e 'xxxxx' a b c⽅式运⾏时,a b c才会被收集到ARGV数组ARGV数组索引从0开始计算,索引0位从脚本名(perl程序名)之后的参数开始计算默认,这些命令⾏参数是perl程序的数据输⼊源,也就是perl会依次将它们当作⽂件进⾏读取参数是有序的,读取的时候也是有序的需要区分ARGV变量和ARGV数组:$ARGV表⽰命令⾏参数代表的⽂件列表中,当前被处理的⽂件名@ARGV表⽰命令⾏参数数组$ARGV[n]:表⽰命令⾏参数数组的元素ARGV:表⽰<>当前正在处理的⽂件句柄例如,test.plx的内容如下:/usr/bin/perlprint '$ARGV[0] ---> ',$ARGV[0],"\n",'$ARGV[1] ---> ',$ARGV[1],"\n",'$ARGV[2] ---> ',$ARGV[2],"\n",'$ARGV[3] ---> ',$ARGV[3],"\n",'$ARGV[4] ---> ',$ARGV[4],"\n";执⾏这个程序:shell> ./test.plx -w a b c d$ARGV[0] ---> -w$ARGV[1] ---> a$ARGV[2] ---> b$ARGV[3] ---> c$ARGV[4] ---> d因为是数组,所以可以修改数组,⽐如强制指定元素:/usr/bin/perl@ARGV=qw(first second third);print '$ARGV[0] ---> ',$ARGV[0],"\n",'$ARGV[1] ---> ',$ARGV[1],"\n",'$ARGV[2] ---> ',$ARGV[2],"\n";shell> ./test.plx a b c d$ARGV[0] ---> first$ARGV[1] ---> second$ARGV[2] ---> third例如,读取2个⽂件(a.log,b.log)的内容:/usr/bin/perlwhile(<>){print $_;}shell> ./test.plx a.log b.log如果想读取标准输⼊,只需使⽤"-"作为⽂件参数即可。
perl脚本基础总结1. 单引号字符串中的\n不会被当做换⾏符处理。
如:'\'\\' --> '\ 。
2. 双引号字符串联 "Hello"."World"."\n" --> HelloWrold 换⾏;字符串重复操作 "fred"×3 --> "fredfredfred";⼤⼩写 "\l","\L" --> ⼩写 ; "\u","\U" --> ⼤写 ; "\E" 结束。
3. 字符串运算== eq 相等!= ne 不等< lt ⼩于> gt ⼤于<= le ⼩于或等于>= ge ⼤于或等于4. ⽤户输⼊ <STDIN>5. chomp函数:去掉⽂本的"\n"换⾏符。
读写⽂件时,要去掉换⾏符。
如:chomp($text<STDIN>);6. 单⾏注释:# ; 多⾏注释以 "=pod"开始,"=cut" 结束。
7. undef:没有值时,表现为0或空字符串。
8. defined函数:为undef时,返回false,其余返回true。
9. x 输出遍数。
如:print "love" x 3 -->lovelovelove.10. 特殊数组索引:"$#rocks" ,最后⼀个元素索引。
11. qw简写,代替 "" 功能。
如:qw(freds bany wilad dino);12. @rocks=qw /break slasle labv/; #给数组赋值。
@copy=@qwarry; #将⼀个数组拷贝到另⼀个数组⾥。
1 基本输入输出在 BASH 脚本程序中,我们用 read var 来实现从键盘的输入,用 echo $var 来实现输出。
那么在 Perl 中将有一点变化。
Perl 中将标准输入用关键词表示;标准输出用表示,标准错误输出用表示。
故而从标准输入读取数据可以写成:$var=; # 读取一行输入,并存入变量 $var 中。
@var=; # 读取多行输入,并存入数组 @var 中。
在 Perl 语言中,变量 $_ 是许多操作符的缺省变量。
因此如果需要读入许多行并对每行分别处理一般这样写:while($_=){chop($_); # chop 调用用于去掉 $_ 变量中的最后一个字符(换行符)。
# 处理$_(每一行)}或者可以简写为:while(){chop; # 等同于chop($_)# 处理$_(每一行)}如果 <> 括号之间没有任何字符,则表示从命令行所指示的文件中读取数据,看下面这个例子(read.pl):#!/usr/bin/perl;while(<>){print $_;}如果在命令行输入 $ perl read.pl read.pl 。
这个程序将在屏幕上打印出文件 read.pl 的每一行。
在前面的例子中我们已经看见,Perl 语言中向标准输出输出数据可以用 print 语句。
我们在 print 语句中可以输出多个变量,变量之间用 "," 分隔开来。
如下面的例子:print 3,45*2,"hello",2+2;上面的输出语句将给出 "390hello4" 的输出结果。
除了 print 语句以外,Perl 中还提供了一个 printf 语句用于标准输出,不过 printf 更接近于 C 语言的 printf 函数,可以进行格式化的输出,如:printf "%10s% 8d%8.2f\n",$a,$b,$c;printf("%10s% 8d%8.2f\n",$a,$b,$c); # 加上括号的 C 语言写法也是可以的。
Perl及CGI的Perl实现CGI是Common Gateway Interface(公共网关接口)的缩写。
在物理上,CGI是一段程序,一种基于浏览器的输入,在Web服务器上运行的程序,提供同客户端HTML页面的接口。
CGI的出现弥补了以前WWW只能单向浏览的不足。
通过CGI,可以实现浏览器与用户之间的交互。
可以说,CGI的出现是WWW能受广大使用者日益喜爱的最大原因。
当我们在一个网页上填写了一个表单(FORM)并按“发送”(SUBMIT)按钮时,表单中填写的信息被传送到服务器,服务器寻找在<FORM>标记中“ACTION”所指定的程序,然后运行这一程序,这一程序就是CGI。
CGI程序首先请求网页FORM中的内容,把它赋给变量,然后访问数据库,写入数据表,或是从数据库中读出数据,把这些数据用HTML页面的形式发送到客户端。
CGI可以用任何语言编写,只要能够在你的服务器上运行。
目前Perl语言已成为CGI 编程的首选,因为它适应所有的平台,而且拥有很多对Web来说非常理想的工具。
1 Perl的安装与运行Perl是Practical Extraction and Report Language的缩写,最早由Larry Wall设计,并由他不断更新和维护,用于Unix环境下的编程。
Perl具有高级语言的强大功能和灵活性,又与脚本语言一样,不需要编译器,只要用任何文本编辑器写出程序并让Perl 来运行即可。
1.1 Perl在Windows XP上的安装Perl它有多种版本,我们安装的是Windows上的ActivePerl 5.6.1。
首先下载“activeperl-5.6.1.628-mswin32-x86-multi-thread.msi”至任何临时目录,双击执行程序,打开Perl安装向导(如图1所示)。
图1 Perl安装向导安装向导允许你选择安装目录(我们安装在D:\Perl目录下),并给出4个选项:●Add Perl to the PA TH environment variable●Create Perl file extension association●Create IIS script mapping for Perl●Create IIS script mapping for Perl ISAPI前两个选项把Perl的路径加入环境变量和使Perl程序与Perl解释器相关联。
在Perl中使⽤Getopt::Long模块来接收⽤户命令⾏参数我们在linux常常⽤到⼀个程序需要加⼊参数,现在了解⼀下 perl 中的有关控制参数的模块 Getopt::Long ,⽐直接使⽤ @ARGV 的数组强⼤多了.我想⼤家知道在 Linux 中有的参数有⼆种形式.•长参数 –help•短参数 -h也就是-和–的分别.–表⽰完整参数.-表⽰简化参数.在 Perl 的这个模块中也⽀持这⼆种⽅法.这要介绍的⼆ Getopt 其实有⼆个模块,⼀个叫 Getopt::Long ⼀个叫 Getopt::Std.下⾯就只介绍 Getopt::Long 了.因为这个模块更加强⼤初始化 Perl命令⾏中所接受的参数,简化了命令⾏参数的解析.下⾯看程序的例⼦复制代码代码如下:#!/usr/bin/perluse strict;use Getopt::Long;use Smart::Comments;my @libs = ();my %flags = ();my ( $verbose, $all, $more, $diam, $debug, $test, $step);GetOptions('verbose+' => \$verbose,'more!' => \$more,'debug:i' => \$debug,'lib=s' => \@libs,'flag=s' => \%flags,'test|t' => \$test,'all|everything|universe' => $all,);### $verbose### $more### $debug### $test### @libs;### %flags•‘verbose+' 接有 + 的选项不接收变量,后⾯不需要加内容.直接使⽤就⾏了,会在每次出现时增加⼀次变量,就是讲命⾏时在参数中 -verbose -verbose 出现⼆次时 verbose 的值就会变成 2.•‘more!' 接有 ! 的选项不接收变量(也就是讲后⾯不需要加参数 –more 来使⽤就⾏了),只要命令⾏中出现了这个参数,就会默认是 1 ,是⽤来设置打开和关掉⼀个功能的>.可以在参数前加 no 变成负的例如-nomore.•‘flag=s' 接有 = 的字符串要求接字符串(s)、整数(i),或者浮点(f)等类型的变量.•‘debug:i' 接有 : 的选项会接受缺省为0或者为空字符串的可选变量•‘test|t' 接有 | 的选项表⽰可以给 –test 简写为 -t.•‘lib=s' => @libs 如果相关联的变量是个数组, 如这个地⽅的 @libs, 那么选项可以多次出现, 值可以被推到数组⾥.•‘flag=s' => %flags 如果相关联的变量是个散列, 那么就要求⼀个键=值(key=value)对, 并被插⼊到散列⾥.备注:在匹配参数名的时候,GetOptions 在缺省设置下会忽略⼤⼩写,默认参数被简写为唯⼀的最短字符串(⾸字母)(例如,-m 代表 -more. 相同的⾸字母时,会加上第⼆个字母来区分)根据上⾯的例⼦,⽐如我们写了⼀个程序叫 test.pl .我们只需要在命令⾏中加如下参数:复制代码代码如下:$ ./test.pl --verbose --verbose -v --more \ --lib='/lib' -l '/lib64' --f a=1 --flag b=2 --debug 2 -t fukai有点⼩长,在看看上⾯的,就会明⽩意思了.在这个地⽅,我使⽤了 Smart::Comment 模块,所以在最下⾯的 ### 是会输出这个变量本⾝的内容的.这也是⼀个超级强⼤的模块.我们来看看输⼊这些参数后.会输出什么内容吧.复制代码代码如下:### $verbose: 3### $more: 1### $debug: 2### @libs: [### '/lib',### '/lib64'### ]### %flags: {### a => '1',### b => '2'### }在对⼀下上⾯输⼊的参数,明⽩了吧.Getopt 模块的简单总结※参数类型:整数, 浮点数, 字串复制代码代码如下:GetOptions('tag=s' => \$tag);‘='表⽰此参数⼀定要有参数值, 若改⽤':'代替表⽰参数不⼀定要有参数值‘s'表⽰传递字串参数, 若为'i'表传递整数参数, 若为'f'表传递浮点数.带值参数使⽤的⽅法复制代码代码如下:$ test.pl --tag=string$ test.pl --tag string⽐如需要传⼏个值到 @libfiles 中的操作⽅法.复制代码代码如下:GetOptions ("library=s" => \@libfiles);GetOptions ("library=s@" => \$libfiles);参数传到 @$tag使⽤的⽅法复制代码代码如下:$ test.pl --library lib/stdlib --library lib/extlib有时我们需要传送⼀些键值对到程序中进⾏处理,就需要使⽤到这个功能了.复制代码代码如下:GetOptions ("define=s" => \%defines);GetOptions ("define=s%" => \$defines);使⽤的⽅法复制代码代码如下:$ test.pl --define os=linux --define vendor=redhat我们需要参数加个简写之类的别名时,可以使⽤下⾯的⽅法复制代码代码如下:GetOptions ('length|height=f' => \$length);第⼀个名称为 primary name, 其他的名称为 alias(可有多个alias名称) ,当使⽤hash参数时, 使⽤primary name作为key值。
perl基本语法介绍本文介绍从变量类型、操作运算符、控制叙述、子程序、I/O和档案处理、RegularE某preion、SpectialVariable、Help、函数、总结几个部分介绍perl,只是叙述了一些Perl的基本语法一.数据类型(Datatype):Perl的数据类型大致分为四种:Scalar(变量)、ScalarArray(数组)、HahArray(散列)、Reference(指针),看起来虽少但用起来却绰绰有余。
尤其在写Perl程序时可以不必事先宣告变量,这一点对刚学程序语言的人甚为方便,不过为了以后程序除错和维护方便,我建议你还是养成事先声明变量的习惯比较好。
1Scalar(纯量变量):纯量变量是Perl里最基本的一种数据型态,它可以代表一个字符、字符串、整数、甚至浮点数,而Perl把它们都看成是一样的东东!你甚至可以混着用,不可思议吧。
例如:#井字号开头的后面都是批注。
#纯量变数以$开头。
#my是一种宣告变量的方式,它可以使变量区域化。
#宣告变量时若不加my或local则Perl会把它当作全域变量使用。
#习惯上,我们会将字符串用双引号括起来,而数值就不用加引号。
my$某=\my$某=123;my$某=4.56;1-1常用的操作运算符1)、算术运算符+(加)、-(减)、某(乘)、/(除)、某某(幂)、%(余)、-(负)(1)求幂(某某)结果不能超出数的范围。
当指数为小数时,底数不能为负数,例如:25某某1.5=125,(-25)某某1.5=(不成立)(2)取余(%)操作数为整数,否则要截取。
第二个数不能为0(因为除数不能为0)(3)负(-)-$a=$a某(-1)此外,注意当一个字符串参加运算,需要转化为整数时,如果不能转化为整数则值为0。
例如:'2'+1=3,'a'+1=12)、数字比较运算符(大于)、==(等于)、<=(小于等于)、>=(大于等于)、!=(不等于)、<=>(比较)(1)==:比较运算,比较的结果为真或非零,假或零(2)<=>:比较运算例如:$a<=>$b,当$a>$b时,值为1;当$a(3)自动把操作数转化为整数,不能转化为整数则为0(4)浮点数不精确,不要把值相近的数比较,否则得到的结果是出乎意料的3)、字符串比较运算符lt(小于)、gt(大于)、eq(等于)、le(小于等于)、ge(大于等于)、ne(不等于)、cmp(比较)(1)字符串的比较原则:按照字母表的顺序比较,数字后z与c进行比较)(3)当一个串是另一个的前缀时,长度长的为大。
1.操作符描述lt 小于gt 大于e q 等于le小于等于g e 大于等于ne 不等于cmp 比较,返回1, 0, or -1 2.逻辑或:$a || $b 或$a or$b逻辑与:$a &&$b 或$a an d $b逻辑非:! $a或 no t $a逻辑异或:$axor $b3.表达式等效表达式$a = 1; none (bas ic as signm ent)$a -= 1;$a =$a -1;$a *=2; $a = $a * 2;$a/= 2; $a = $a / 2; $a %= 2; $a = $a % 2;$a **=2; $a = $a ** 2;$a &= 2; $a= $a& 2;$a |= 2;$a =$a |2;$a ^=2; $a = $a ^ 2;4.字符串联结和重复操作符联接: .重复:x联接且赋值(类似+=): .=例:$news tring = "p otato" . "head";$newst ring= "t" x 5;$a = "b e"; $a .= "wi tched"; #$a is now"bewi tched"5.条件操作符与C中类似,条件?值1:值2,当条件为真时取值1,为假时取值2,如:$resu lt =$var== 0? 14: 7;$re sult= 43+ ($d iviso r ==0 ? 0 : $d ivide nd /$divi sor);PE RL 5中,还可以在赋值式左边使用条件操作符来选择被赋值的变量,如: $co ndvar == 43 ? $var1: $va r2 =14; $con dvar== 43 ? $v ar1 = 14 : $var2 = 14;6.数组--列表的存贮列表存贮于数组变量中,与简单变量不同,数组变量以字符"@"打头,如: @a rray= (1, 2, 3);7.$var= <ST DIN>;@arra y = <STDIN>; #^D为结束输入的符号8.数组的输出:(1) @array = (1, 2,3); pr int (@arra y, "\n");(2) @array = (1, 2,3); pr int ("@arr ay\n");结果为:1 2 3sca lar()获得数组的元素个数9.列表/数组的长度当数组变量出现在预期简单变量出现的地方,则PERL解释器取其长度。
1. 获取用户输入:2. chomp操作符作用:去除字符串后面的换行符3. 注释:# 注释4. 数组的最后一个值的索引:在变量中加一个#所以数组的个数就是$#rock + 15. 列表赋值6. 创建数组:@name引用的时候:$name[]数组的赋值:7. 数组尾部操作:Push和pop数组头部操作:Unshift(插入)和shift(取出)8. splice操作符可以对数组中的任意位置进行插入和删除操作。
它可以接受4个变量第一个变量是数组名,第二个变量是起始索引,第三变量是长度,第四个变量是补充数组。
二个参数:删除后面全部三个参数,设定删除的长度:四个参数:设定插入的东西9. 标量内插到字符串中:数组也可以内插到字符串中,在内插过程中,会添加空格10. foreach使用默认值,不使用变量:11. reverse操作符:用于将次序变反12. sort操作符用于对数组进行排序13. 对数组使用each操作符:Each可以用于提取哈希的键值,这样也同时可以提取数组的序号和数值。
use 5.012;这样写主要是想用 say如果不用each,需要实现的过程如下:14. 上下文:所谓上下文就是返回的值是根据需要进行返回的。
15清空数组:15. 子程序定义:sub name {};调用子程序:&+子程序名如果我们不写return,照样可以返回,主要是这样写除了返回,没有任何意义。
如果没有明显返回值,就是返回1传递参数:在子程序调用的时候,可以直接写参数,系统会自动将自动将参数保存到$_[]数组中,然后在子程序中可以直接调用$_[0],$_[1]来获得参数。
16. 子程序的私有变量My +定义私有变量用my定义的私有变量可以用在很多地方,比如在for循环中的i我们就可以定义为局部私有变量。
17. use strict可以使的Perl更加严格这不报错,但这就报错,报出的错误是:也就是说不能轻易的用全局变量,应该像上面那样用my修饰,或者是因为你写错了,应该用上面那个已经定义过的变量。
perl入门程序Perl 是一种容易学习和使用的语言。
1.第一个程序示例:print "Hollo, World!\n"; # perl的输出类C 同类还有printf--格式输出,sprintf--格式预输出phrase = "Howdy, world!\n";print $phrase;请注意,在 Perl 中我们不必事先定义 $phrase 是什么类型的变量,$ 符号告诉Perl, phrase是一个标量,也就是包含单个数值的变量。
与此对应的数组变量使用 @ 开头。
(可以将 $ 理解成代表 "s" 或 "scalar"(标量),而 @ 表示 "a" 或 "array" (数组)来帮助你记忆。
)2.perl的数据种类:Perl 还有象“散列”(又名“哈希结构”或“hash”,或称“关联数组”),“句柄”(或称“资源符”),“类型团”(或称“指针”)等其他一些变量类型,与标量和数组一样,这些变量类型也是前导趣味字符,下面是你将会碰到的所有趣味字符:3.关于数组的解释:将食物中的水果列出,列表如下:$food{"fruit"} = ("apple", "peach", 'banana", "pear"); # 错很不幸,代码并不能象你希望的那样运转,因为在 Perl 中括弧和逗号还不够强大,还不能将一个列表转换成为标量(在语法中,圆括弧用于分组,逗号用于分隔)。
你需要明确地告诉 Perl 你想将一个列表当成一个标量。
[] 中括弧能够实现这个转换:$food{"fruit"} = ["apple", "peach", 'banana", "pear"]; # 正确4.简单数据结构:Perl 也有一些主题化的方法,最主要的就是使用 package 声明。
Perl语言入门教程Perl语言入门教程引言Perl是一种非常简单、应用广泛且反响很好的脚本语言。
它可用于各种任务(例如,您可以使用它创建DOS批处理文件或C外壳脚本的等效文件),但在网络开发环境中,它用于开发CGI脚本。
由于Perl是一种脚本语言,所以使用它的一个好处就是可以分发程序的源代码。
这就为您提供了学习Perl的机会,您也可以下载和修改数千个Perl脚本,以供自己使用。
Perl的缺点之一就是,多数的免费代码都难以理解。
这使Perl自身成了一种神秘的语言类型!本文假定您已经知道如何编程(如果您了解C编程语言,这对您将非常简单)。
一旦掌握了有关Perl的基础知识,使用起来就会非常简单。
在本文中,我们将首先介绍如何使用Perl 执行最常见的编程任务。
阅读本文后,您将可以相对轻松地编写自己的Perl脚本,还可以轻松地读取其他人编写的含义模糊的脚本,这将是一个好的开始。
Perl语言入门指南要启用Perl,您需要有Perl解释程序。
在任何装有UNIX的计算机上,99.99%的都已安装了Perl解释程序。
在装有Windows或Mac计算机上,您需要下载最新的语言版本并将其安装到计算机上。
您可从网上轻松下载Perl,并且是免费的。
接下来,请确保查看Perl附带的DOCS目录,其中会有类似用户手册的资料。
从某种意义上说,读完所有文档,或只是先浏览一下都会很有帮助。
最初会觉得很麻烦,但在读完本文后,您将获得更多的认识。
输出字符“Hello World”如果您已加载了Perl,请确保已正确设置了路径以包含Perl 的可执行文件。
然后,打开文本编辑器并创建一个文本文件。
在文件中,输入以下行:print "Hello World!n";将文件命名为“test1.pl”。
在命令提示符下键入:perl test1.plPerl将运行并执行文本文件中的代码。
您应该会看到词语“Hello World!”打印到标准输出中。
Perl命令行参数执行控制-e 指定字符串以作为脚本(多个字符串迭加)执行-M 导入模块-I 指定目录以搜索标准位置前的模块整洁性-w 打开警告-Mstrict 打开严格编译指示(pragma)数据-0 (这是个零)指定输入记录分隔符-a 将数据分割成名为@F 的数组-F 指定分割时-a 使用的模式(请参阅perldoc -f split)-i 在适当的位置编辑文件(请参阅perldoc perlrun 以获取大量详细信息)-c 进行perl的语法检查,但不执行perl命令-F 把缺省的分离号改为你想要的。
例如把分离号定为非字符-l 使用-l有两个效果,第一自动chomp输入分隔号,第二把$/值付给$\(这样print的时候就会自动在末尾加\n)-n 使用<>将所有@ARGV参数当作文件来逐行运行,会将读入的内容隐式的逐一按行来遍历文件,每一行将缺省保存在$_-p 和-n一样,但是还会打印$_的内容请注意-p 开关和-n 开关的使用当您想显式打印数据时,使用-n开关。
-p开关隐式地将print $_语句插入到-n开关所产生的循环中。
因此,-p开关更适用于对文件进行的完全处理,而-n开关更适用于选择性文件处理,这样的处理只需打印特定数据。
以下是一些常用的简单实例#perl -pi –e‟s/aaa/bbb/‟ filename修改当前file文件中的文件,不生成中间文件,速度很快。
记住-i开关,因为它让你原地编辑文件。
#perl -ne …print if /^aaaaa/‟ filename象grep一样过滤文件中需要的内容。
这个地方使用了-n,所以一次是做一行的操作,直到整个文件读完。
另外在管道时,-n也会一样来遍历管道送过来的内容。
# perl -n -e 'print "$. – $_"' filename这个例子中的,没用-ne,只是命令写成了-n –e,其实一样,这个例子中是给当前文件中的内容都加一个行号打印出来。
注:$.表示当前行号#perl -pe …$_ = “$. $_”… filename这个其实和上面一样,分别只是使用了-p替换了-n,这个有个什么好处啦,别的地方都一样,但-p按行来遍历完文件后,会给$_打印出来。
大家还记得awk分割域(awk ‘{i = NF –1; print $1 + $i}’)啊,是不是很方便,下面我们来看看perl# perl -lane 'print $F[0] + $F[-2]'这个神奇的地方在于-a,使用-a后,因为-n分行读进来,然后-a给数据分割成@F的数组。
#perl -ne …print if /^START$/ .. /^END$/‟打印正则中从$start到$end的地方#perl -ne …print if $. >= 15; exit if $. >= 17;‟有效地打印数字范围中的行#perl -p -i.bak -e …s/\bfoo\b/bar/g‟ *.c原地修改-i开关的神奇之处在于它对@ARGV中的每个文件都用该脚本对该文件输出所产生的文件版本进行替代#perl -ne …print scalar reverse $_‟ test给文件中的内容反向排序,比如文件中有fukai,就会变成iakuf第一部分:SafetyNetOptions安全网参数在使用Perl尝试一些聪明(或stupid)的想法时,错误难免会发生.有经验的Perl程序员常常使用三个参数来提前找到错误所在,1:-C这个参数编译Perl程序但不会真正运行它.由此检查所有语法错误.每次修改perl程序之后我都会立刻使用它来找到任何语法错误.$perl-cprogram.pl2:-W它会提示你任何潜在的问题.Perl5.6.0之后的版本已经用usewarnings;替换了-w.你应该使用usewarnings因为它要比-w更灵活.3:-T它把perl放到了tain模式.在这个模式里,Perl会质疑任何程序外传来的数据.例如,从Perl命令行读取,外部文件里读取或是CGI程序里传来的数据.这些数据在-T模式里都会被Tainted掉.第二部分:Perl命令行Perl参数:可以让短小的Perl程序运行在Perl命令行1:-e可以让Perl程序在Perl命令行上运行.例如,我们可以在Perl命令行上运行"HelloWorld"程序而不用把它写入文件再运行.$perl-e'print"HelloWorld\n"'多个-e也可以同时使用,运行顺序根据它出现的位置.$perl-e'print"Hello";'-e'print"World\n"'象所有的Perl程序一样,只有程序的最后一行不需要以;结尾.2:-M可以象通常一样引用模$perl-MLWP::Simple-e'getstore("/","163.html")'##下载整个网页-M+模块名和use模块名一样第三部分:隐式循环3:-n增加了循环的功能,使你可以一行一行来处理文件$perl-n-e'print;'1.txt#####$perl-ne'print;'1.txt这与下面的程序一样.LINE: while(<>;){ print; } <>;打开Perl命令行里的文件,一行行的读取.每一行缺省保存在$_ $perl-n-e'print"$.-$_"'file上面的这一行可以写成LINE: while(<>;){ print"$.-$_" } 输出当前行数$.和当前行$_.4:-p,和-n一样,但是还会打印$_的内容如果想在循环的前后做些处理,可以使用BEGIN或ENDblock.下面的这一行计算文件里的字数.$perl-ne'END{print$t}@w=/(\w+)/g;$t+=@w'file.txt每一行所有匹配的字放入数组@w,然后把@w的元素数目递加到$t.ENDblock里的print最后输出文件总字数.还有两个参数可以让这个程序变得更简单.5:-a打开自动分离(split)模式.空格是缺省的分离号.输入根据分离号被分离然后放入缺省数组@F 使用-a,上面的命令可以写成这样:$perl-ane'END{print$x}$x+=@F'file.txt##使用了-a6:-F把缺省的分离号改为你想要的.例如把分离号定为非字符,上面的命令可以改为:$perl-F'\W'-ane'END{print$x}$x+=@F'file.txt下面通过Unixpassword文件来介绍一个复杂的例子.Unixpassword是文本文件,每一行是一个用户记录,由冒号:分离.第7行是用户的登录shell路径.我们可以得出每一个不同shell路径被多少个用户使用:$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进制数值,这个值用来付给$/.-00打开段落模式,-0777打开slurp模式(即可以一次把整个文件读入),这与把$/设为空字符和undef一样效果.单独使用-l有两个效果:第一:自动chomp输入分隔号第二:把$/值付给$\(这样print的时候就会自动在末尾加\n)1:-l参数,用来给每一个输出加\n.例如$perl-le'print"HelloWorld"'第五部分:原位编辑使用已有的参数我们可以写出很有效的Perl命令行程序.常见的UnixI/O重定向:$perl-pe'somecode'>output.txt这个程序从input.txt读取数据,然后做一些处理再输出到output.txt.你当然也可以把输出重定向到同一个文件里.上面的程序可以通过-i参数做的更简单些.2:-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是源文件的备份.perl答案:perl-anle'$cnt{$F[0]}+=$F[1];END{print"$_\t$cnt{$_}"forkeys%cnt}'urfile如果熟悉了上面几个Perl命令行参数的用法,上面的这个命令应该很好理解:每次读取urfile的一行,由于使用了-a,打开自动分离(split)模式.空格是缺省的分离号.输入根据分离号被分离然后放入缺省数组@F中,以文件的第一行为例子$F[0]就是aaa@,$F[1]就是2$cnt{$F[0]}+=$F[1]就是一个哈希数组,以$F[0]为key,$F[1]为value,把相同key的数值都叠加起来.然后把文件的每一行都这样处理一次.END{}就是在循环完之后再处理.里面的意思就是打印这个%cnt哈希数组.这个哈希数组的key就是邮箱名称,value就是叠加后的数字.下面的是上面行命令的文本形式:。