您的位置:首页 > 其它

perl选项、特殊变量、一些函数参考手册

2019-01-04 13:25 471 查看

本文用来收集Perl一行式中涉及到的一些选项、特殊变量、一些函数的说明,可以用来做速查手册。

本文会逐渐更新。

第一次学Perl一行式时,请直接忽略本文内容,并直接从后面的示例部分开始看。本文会在每一个示例中解释出现的选项、变量、函数和语法。

一行式选项

perl一行式语法:

perl [-0aFliImMnps] -e 'EXPRESSION' ARGUMENTS
perl [-0aFliImMnps] -E 'EXPRESSION' ARGUMENTS

其中"-e"或"-E"选项用于指定待运行的表达式,它们之间的不同点在于"-E"会自动启用高版本功能特性,例如可以直接使用say()函数而无需先

use 5.010;

-n和-p

这两个选项都表示按照隐含的逻辑直接处理表达式后面的参数代表的文件。如果

perl -e
命令行中没有这两个选项,则只能自己在-e表达式中编写读取文件、处理数据、输出/删除的代码逻辑。

-n选项使得perl单行命令以类似于如下代码的方式运行:

LINE:
while(<>){
...-e expression CODE HERE...
}

由于while中使用的是

<>
,所以它会从
@ARGV
中读取参数文件进行处理。

perl -n
就像
sed -n
一样,表示禁止默认的输出。如果想要强制输出,只能在-e表达式中自行指定输出操作,例如print/say/printf。

-p选项使得perl单行命令以类似于如下代码的方式运行:

LINE:
while(<>){
...-e expression CODE HERE...
}continue{
print or die "-p destination: $!\n";
}

perl -p
用于强制输出
$_
,它会覆盖-n选项。

必须要注意的是-n和-p都采用

<>
来读取文件,而它从文件中读取每一行时会保留每一行的尾随换行符"\n"。

何时使用"-p",何时使用"-n"

-p和-n的逻辑虽然很简单,也如sed的-n和p命令类似,但对于初学perl一行式程序的人来说,仍然很容易迷惑,因为Perl是一门语言,perl一行式也一样可以写成一门简单的语言,这意味着几乎总是有多种一行式的方式实现一个需求。

例如,-p可以被

-n + print
替代,-n、-p都可以被-e中的
while(<>)
替代。

但既然perl一行式提供了-n和-p的选项,写perl一行式的时候自然应该追求精简化,让-e表达式的代码逻辑更简单。

根据我个人的总结:

  1. 只要不操作文件,就不需要-n和-p
  2. 某些行不需要输出,或者需要被删除的时候,也就是说不需要输出所有行时,不应该使用-p,因为它默认会输出所有行
      换句话说,如果需要输出所有行,就可以考虑使用-p
    • 使用-p的时候,在-e表达式中只需操作
      $_
      ,例如对
      $_
      的赋值、s替换,此时不需要额外的print
  3. 不使用-p的时候,几乎总是可以使用-n,这时需要在-e表达式中手动print
  4. 如果处理文件的需求实在复杂,那么不要-n和-p,自己在-e中写文件读取的逻辑。但这种情况很少,真的出现这种情况,一般写成Perl脚本更好

-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选项的参数值,而不是-0选项。

一般来说,"-l"选项是用来为print函数追加换行符的,所以"-l"经常结合-n选项一起使用。例如:

$ perl -lne 'print' file.log

-0选项

设置输入行分隔符

$/

-0[octal/hexadecimal]

-0
使得perl读取行时,以
\0
作为行输入分隔符,也就是对行输入分隔符变量
$/
进行赋值:
$/ = "\0";

如果没有给定任何选项参数,则表示设置为null,即等价于

$/ = undef
,这表示一次性从文件头部一直读取到文件尾部当作一行。

如果给定了OCTNUM,即

\0OCTNUM
,则将八进制数值OCTNUM对应的ACSII作为行输入分隔符。

特别地,设置

-00
表示将
$/
设置为空"",即
$/ = ""
,这表示按段落读取到
$_
且压缩连续空行。

-m和-M选项

这两个选项用来导入模块。

-mmodule
-Mmodule
-M'module ...'
-[mM]module=arg[,arg]...

-m
导入模块时,相当于执行了
use module ();
,这表示在程序中必须使用完整的名称来引用模块中的属性。例如
-m'List::Util'
时,在-e表达式中要使用其max函数,需要指定为
List::Util::max @arr

-M
导入模块时,相当于执行了
use module;
,这时要使用模块中的属性仍然需要些完整的名称。但
-M
还支持额外的参数。例如
-M'List::Util qw(max sum)'
表示导入
List::Util
模块中的max和sum函数,这时在-e表达式中可以直接使用这两个函数名,而无需写完整的名称
List::Util::max @arr

对于-m和-M,还有另一种"="的写法,这种写法使得-m和-M没有任何的区别。例如

-m'List::Util=sum,max'
-M'List::Util=sum,max'
是等价的,它们都表示导入这
List::Util
模块中的sum和max函数,使得使用这两个函数的时候无需再写完整名称。

特殊变量

$\

表示print函数的输出行分隔符。默认为undef,所以print默认输出时两端数据总是连在一起的。

可以指定为换行符"\n",这样print输出每段数据都会自带换行符。

$ perl -e '$\ = "\n";print "haha"'
haha

但必须注意,对于perl一行式程序的-p选项,它通过

<>
读取数据时会保留每一行的尾随换行符(除非在-e表达式中使用了chomp/chop),这时不应该额外设置
$\ = "\n"
,否则每行后面都会多输出一空行。

$/

表示读取文件时的输入行分隔符,默认为换行符"\n"。在读取文件的时候,通过该特殊变量可以控制如何分行。

可以设置为多个字符。

如果设置为undef,表示一次性从文件头一直读取到文件尾当作一行。

如果设置为空""或"\n\n",表示按段落读取。不同的是:

  • 设置为空""时,表示压缩连续空行为单个空行,压缩后的单空行属于当前段落
  • 设置为"\n\n"则盲目地认为下一行一直属于当前段落,即使是空行,也即是不会压缩连续空行

$.

$.
表示当前处理的行的行号。

实际上,它表示的是当前正在被打开的文件句柄的行号计数器。只要文件句柄不显式关闭,行号计数器就不会重置(open的隐式关闭以及reopen都不会重置)。

<>
读取ARGV文件时从不关闭文件句柄,所以在一行式perl程序中使用了-n/-p时,多个参数文件的行号是连续下去而不会重置的。

如果确实想要重置

<>
所读取的每个文件的行号,可以通过eof函数来判断,在到了文件底部的时候就关闭当前处理的文件。

while(<>){
print "$. $_\n";
} continue {
close(ARGV) if eof   #注意,不是eof()
}

例如:

$ perl -e 'while(<>){print "$. $_"} continue {close(ARGV) if eof}'

eof和eof()是不同的,前者判断每个文件的文件尾部,后者则判断最后一个文件的尾部(也就是无内容可读了)。所以,下面的表示在最后一个文件的前面插入一行分割线。

while(<>){
print "-" x 30,"\n" if eof();
print "$. $_"
}

一些函数

length()

length()函数返回字符串的字符个数(不是字节数)。

BEGIN/END

BEGIN语句块在程序编译期间执行,END语句块在程序主体代码执行完并在退出之前执行。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐