Perl命令行:一行式程序

语法

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

你可能感兴趣的:(Perl命令行:一行式程序)