语法
perl命令行在运行"一行式程序"非常有用,用法如下:
[root@redisa-b ~]# perl --help
Usage: perl [switches] [--] [programfile] [arguments]
-0[octal] specify record separator (\0, if no argument)
-a autosplit mode with -n or -p (splits $_ into @F)
-C[number/list] enables the listed Unicode features
-c check syntax only (runs BEGIN and CHECK blocks)
-d[:debugger] run program under debugger
-D[number/list] set debugging flags (argument is a bit mask or alphabets)
-e program one line of program (several -e's allowed, omit programfile)
-E program like -e, but enables all optional features
-f don't do $sitelib/sitecustomize.pl at startup
-F/pattern/ split() pattern for -a switch (//'s are optional)
-i[extension] edit <> files in place (makes backup if extension supplied)
-Idirectory specify @INC/#include directory (several -I's allowed)
-l[octal] enable line ending processing, specifies line terminator
-[mM][-]module execute "use/no module..." before executing program
-n assume "while (<>) { ... }" loop around program
-p assume loop like -n but print line also, like sed
-s enable rudimentary parsing for switches after programfile
-S 使用PATH环境变量搜索程序文件
-t enable tainting warnings
-T enable tainting checks
-u 在解析程序之后dump core
-U 允许不安全的操作(其中之一:root身份删除目录)
-v 输出版本号、补丁版本
-V 输出Perl的主要配置概要和@INC、@ENV的当前值
-V:variable 输出Config.pm中的某个变量
-w 启用大多数warnings信息
-W 启用所有的warning信息
-x[directory] 忽略#!perl行前面的所有文本(如果指定directory,则先切换到该目录)
-X 禁止所有的warnings信息
单行式程序选项
选项e
-e
选项用于指定待运行的表达式
perl -e 'print "haha!!!\n"'
它就相当于在运行一个包含了如下代码的perl程序:
print "haha!!!\n"
-e是使用perl单行程序的开关,使用该选项后,perl将不再从参数中读取文件名。
可以同时指定多个"-e"。
选项n和p
-n
选项使得perl单行命令以类似于如下代码的方式运行:
LINE:
while(<>){
...-e expression CODE HERE...
}
由于while中使用的是<>
,所以它会从@ARGV
中读取文件名进行处理。
perl -n
就像sed -n
一样,禁止默认的输出。
-p
选项使得perl单行命令以类似于如下代码的方式运行:
LINE:
while(<>){
...-e expression CODE HERE...
}continue{
print or die "-p destination: $!\n";
}
perl -p
用于强制输出,同时还会输出$_
,它会覆盖-n选项。
选项l
-l
选项开启自动行尾处理功能
-l
-lOCTNUM
该选项有两个效果:
- 1.和-n和-p一起使用的时候,将自动使用chomp行终止符
- 2.将print的输出行分隔符变量
$\
设置为OCTNUM的数值,OCTNUM的ASCII字符将追加在输出的每一行行尾。如果省略了OCTNUM,则将$\
设置为输入行分隔符变量$/
的值,通常是换行符
需要注意的是,省略OCTNUM的时候,也就是只有-l
的时候,会处理这个选项的那一刻就完成$\ = $/
的赋值,所以,如果-ln0e EXPRESSION
将进行两段赋值:
# 处理-l的时候
$\ = $/;
# 处理-0的时候
$/ = \0;
上面的选项不能将-0
放在-l
后面,否则-l0ne
的0将被认为是-l
的选项参数。
选项i
-iSUFFIX
用于保存处理结果
如果没有给定SUFFIX,则直接覆盖的源文件中保存,如果指定了后缀SUFFIX,则将源文件以后缀名SUFFIX的方式备份起来,然后将处理结果保存到源文件名中。
如果SUFFIX中不包含星号*
,则SUFFIX直接追加在文件名的尾部。如果包含了*
,则每个*
都被替换为SUFFIX。SUFFIX甚至可以包含目录名以便保存到其它目录下,但要求目录必须已经存在,且不能使用~
表示家目录。
在内部,perl先重命名文件,然后用原文件名打开输出文件,并把该输出文件作为print、printf和write的默认文件句柄的对象。
选项a和F
-a
选项打开自动分割模式,只能在-n
或-p
模式下使用
-a
使得-n
或-p
的while循环中首先对行进行一次隐含的split分割操作,并将分割后的结果放进数组@F
中,使其可以成为一个个的字段,并通过$F[n]
的方式调用各字段,其中n为字段的索引号,从0开始计算。
通过-a
选项,可以使perl单行程序可以以类似于awk的方式运行,只不过awk的第一个字段是从$1
开始的,而-a
的第一个字段是从$F[0]
开始的。
例如:
perl -ane 'print pop(@F),"\n";'
等价于:
LINE:
while(<>){
@F = split(' ');
print pop(@F),"\n";
}
可以使用-Fpattern
指定字段分隔符,也就是作为split的第一个参数。pattern可以被双斜线//
、单引号''
或双引号""
包围,如果没有给定符号,则默认使用单引号。
选项0
-0
使得perl读取行时,以\0
作为行输入分隔符,也就是对行输入分隔符变量$/
进行赋值:$/ = "\0";
如果给定了OCTNUM,即\0OCTNUM
,则将八进制数值OCTNUM对应的ACSII作为行输入分隔符。
BEGIN和END块
BEGIN块和END块用于主循环while之前和之后,就像awk的BEGIN和END一样。
用法示例
输出/etc/passwd的第一个字段:
perl -a -F":" -ne 'print $F[0],"\n";' /etc/passwd
perl -a -F":" -lne 'print $F[0];' /etc/passwd