perl选项、特殊变量、一些函数参考手册
本文用来收集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表达式的代码逻辑更简单。
根据我个人的总结:
- 只要不操作文件,就不需要-n和-p
- 当某些行不需要输出,或者需要被删除的时候,也就是说不需要输出所有行时,不应该使用-p,因为它默认会输出所有行
-
换句话说,如果需要输出所有行,就可以考虑使用-p
- 使用-p的时候,在-e表达式中只需操作
$_
,例如对$_
的赋值、s替换,此时不需要额外的print
- 不使用-p的时候,几乎总是可以使用-n,这时需要在-e表达式中手动print
- 如果处理文件的需求实在复杂,那么不要-n和-p,自己在-e中写文件读取的逻辑。但这种情况很少,真的出现这种情况,一般写成Perl脚本更好
-l选项
-l -lOCTNUM
选项开启自动行尾处理功能。它有两个过程:
- 和-n和-p一起使用的时候,将自动对输入行执行chomp剔除输入行终止符
- 将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语句块在程序主体代码执行完并在退出之前执行。
- postgresql触发器函数中的一些特殊变量
- PHP - Manual手册 - 函数参考 - PHP Options&Information - PHP选项与信息 - extension_loaded查询是否加载指定的扩展
- PHP - Manual手册 - 函数参考 - PHP Options&Information - PHP选项与信息 - dl运行时加载PHP扩展
- PHP - Manual手册 - 函数参考 - PHP Options&Information - PHP选项与信息 - dl运行时加载PHP扩展
- Perl中预定义的一些常见特殊变量
- PHP - Manual手册 - 函数参考 - PHP Options&Information - PHP选项与信息 - extension_loaded查询是否加载指定的扩展
- Perl语言中的一些特殊变量
- PHP - Manual手册 - 函数参考 - SOAP Functions - SOAP函数 - SOAP configuration options missing documentation文档中丢失SOAP配置选项
- PHP - Manual手册 - Function Reference函数参考 - Variable and Type Related Extensions变量和类型相关扩展 - Variable handling变量操作 - Variable handl
- PHP - Manual手册 - Function Reference函数参考 - Variable and Type Related Extensions变量和类型相关扩展 - Arrays数组 - Array Functions数组函数 - ksort
- PHP - Manual手册 - 函数参考 - Variable 变量函数 - settype设置变量的类型
- jquery的2.0.3版本源码系列(2):21行-94行定义了一些变量和函数 jQuery=function(){}
- PHP - Manual手册 - 函数参考 - Array 数组函数 - array_diff计算数组的差集
- delphi常用函数、属性、事件参考手册 (转)
- wordpress 常用函数参考手册
- Oracle分析函数参考手册
- perl常用特殊变量列表
- PHP - Manual手册 - 函数参考 - Tokenizer Functions解析器代号函数
- hive 数据类型与函数参考手册
- C++的一些基本功,包括对常量成员函数的一些特殊说明