perlintro.pod中文版
2010-08-16 22:33:23 阿炯

标题
perlintro -- perl语言简要介绍

描述
这篇文档的目的是简要介绍perl编程语言,以便你能进行进一步学习。它是perl新手的叩门砖,它会给你提供足够的信息,以便你能读懂其他人写出的perl程序、大致搞清代码的用途,或者写出你自己的简易脚本。

这篇文档的定位不是“全面具体”。在一些例子中,为了便于体现整体思想我们略去了部分细节。读过本文之后,我们强烈建议你阅读完整的perl手册,以便获得更详尽的知识。手册的目录可以在perltoc中找到。

对perl帮助文档的引用遍及本文各处,你可以使用perldoc命令或其它任何方法来阅读这些文档。

什么是perl?
perl是一种用途广泛的编程语言,最初开发它的目的是为了进行文本处理。当今perl的应用范围十分广泛,包括系统管理、web开发、网络编程、GUI开发等等。

这门语言的目的是“实用”(易用,高效、功能丰富)而非华丽(简单,精美,小巧)。它最主要的特点是易用,同时支持面向过程和面向对象两种编程方式,有强大的文本处理能力,并且收集了大量第三方模块以供使用。

不同的perl文档对perl有不同的定义,比如perlfaq1。从这一点上我们可以看出,perl对于不同的人意味着不同的东西,但至少很多人认同一点:把它写出来很值!

Perl 是由 Larry Wall 创建的一种开放源代码脚本语言,根据其Artistic License 或GNU General Public License (GPL) 获得许可。v1.0 于 1987 年发布到 usenet 的 alt.comp.sources。PC Magazine 宣布 Perl 入围 1998 年开发工具类别的技术卓越奖。它是一种解释型语言,这意味着您的代码可以按原样运行,而无需创建不可移植的可执行程序的编译阶段。

传统的编译器将程序转换为机器语言。当您运行 Perl 程序时,它首先被编译成字节码,然后(在程序运行时)转换成机器指令。所以它与 Shell 或 Tcl 不太一样,后者在没有中间表示的情况下被严格解释;它也不像大多数 C 或 C++ 版本,它们直接编译成机器相关格式。


运行perl程序
在Unix命令行中可以这样执行perl程序:
perl progname.pl
另一种方式是在你脚本的第一行写明:
#!/usr/bin/env perl
然后以"/path/to/script.pl"方式运行该脚本。当然,前提是它有可执行权限,即"chmod 755 script.pl"(Unix系统中)。

基本语法概览
一段perl代码由一条或多条语句构成,这些语句只要以最直接的方式写在你的脚本中就可以了。我们不需要"main()"函数或与之类似的东西。

perl语句以分号结尾:
print "Hello, world";

注释行以#号开头,且只对本行产生影响:
# This is a comment

空白会被忽略:
print
"Hello, world"
;

当然引号字串中的空白除外:
# this would print with a linebreak in the middle
print "Hello
world";

双引号和单引号可以被放在字串两侧:
print "Hello, world";
print 'Hello, world?'

但是,只有双引号中的变量和特殊字符会被替换,比如换行符("\n")。

数字不需要被引号括起:
print 42;

可以在函数参数两侧加括号,当然也可以省略括号,这依你的个人习惯而定。有时括号是必须的,比如为了清楚的表达“优先级”。
print("Hello, world\n");
print "Hello, world\n";

并于perl语法的详细信息请参阅perlsyn。

perl的变量类型
perl有三种变量类型:标量、数组和哈希。

标量(scalars)
一个标量代表一个单值:
my $animal = "camel";
my $answer = 42;

标量值可以是字符串,整数或者浮点数,需要时perl会在它们之间进行自动转换。使用变量前无需事先声明。

标量可以以不同的方式使用:
print $animal;
print "The animal is $animal\n";
print "The square of $answer is ", $answer * $answer, "\n";

有一些神奇的标量,它们的名字看起来像是标点符号。这些特殊的变量被用于各种目的,在perlvar中有对它们的详细说明。现在你需要知道的是$_,一个“默认变量”。在perl中它被许多函数用作默认参数,在某些循环结构中它也被隐式地使用。
print; # prints contents of $_ by default

数组(arrays)
数组是变量的列表:
my @animals = ("camel", "llama", "owl");
my @numbers = (23, 42, 69);
my @mixed   = ("camel", 42, 1.23);

你可以用数组下标获取数组中的元素,下标是从0开始的:
print $animals[0]; # prints "camel"
print $animals[1]; # prints "llama"

特殊变量$#array表示数组最后一个元素的下标值:
print $mixed[$#mixed];       # last element, prints 1.23

你或许倾向于使用“$#array + 1”来表示数组中共有多少元素。其实不用如此麻烦!如果需要,可以在被perl认为是标量的地方(标量上下文)使用@array,你将直接得到答案:
if (@animals < 5) { ... }

如果要从数组中取出单个元素,则要以"$"作为开头,因为你要得到的是一个单独的值--一个标量。
$ivy = $animals[3];(译者附)

可以从数组中取得多个值:
@animals[0,1]; # gives ("camel", "llama");
@animals[0..2]; # gives ("camel", "llama", "owl");
@animals[1..$#animals]; # gives all except the first element

这被称为“数组切片”。

你可以对数组做行多有用的操作:
my @sorted    = sort @animals; (译者注:对@animals按字典序排序)
my @backwards = reverse @numbers; (译者注:对@numbers进行返转)

有几个特定的数组,比如@ARGV(脚本的命令行参数)和@_(传给函数的参数)。这方面的文档可以在perlvar中找到。

哈希(hashes)
哈希是一个集合,用于存放“关键字”/“值”对。
my %fruit_color = ("apple", "red", "banana", "yellow");

你可以使用空白和"=>"符号来更清晰美观地表示“关键字”与“值”的对应关系。
my %fruit_color = (
apple  => "red",
banana => "yellow",
);

可以这样得到哈希中的元素:
$fruit_color{"apple"}; # gives "red"

你可以用keys()和values()分别得到哈希中“关键字”和“值”的列表。
my @fruits = keys %fruit_colors;
my @colors = values %fruit_colors;

哈希中没有特定的内部存放顺序(译者注:换言之你无法像对待数组那样,用类似下标的方法访问哈希),但你可以对“关键字”进行排序并以此顺序访问哈希。

同样有一些特殊的哈希。最出名的要数%ENVb ,它包含各种环境变量的值。你可以在perlvar中找到更详尽的信息。

标量,数组和哈希的尽细文档可以在perldata中找到。

使用“引用”可以构造出更复杂的数据结构,这可以让你在数组和哈希中建立数组和哈希。(译者注:比如把数组作为另一个数组的元素,类似C中的多维数组。)
引用是一个标量值,可以被关联到任何其它的perl数据类型上。将引用作为数组或哈希的元素,你可以很容易的在数组和哈希中存放数组和哈希。下面这个列子展示了如何使用匿名引用在哈希中建立二级哈希:
my $variables = {
scalar  =>  {
description => "single item",
sigil => '$',
},
array =>  {
description => "ordered list of items",
sigil => '@',
},
hash =>  {
description => "key/value pairs",
sigil => '%',
},
};
print "Scalars begin with a $variables->{'scalar'}->{'sigil'}\n";

关于引用的详细信息可以参阅perlreftut、perllol、perlref、perldsc。

变量作用域
在前面几节的的例子中我们均使用了这样的语法结构:
my $var = "value";

实际上“my”不是必需的,你可以这样写:
$var = "value";

然而,上面的用法将在你的程序中建立一个全局变量,这是一种不好的编程习惯。“my”建立了一个词法范围内的变量。这类变量只在定义它们的“块”(比如被花括号包围的一组语句)中有效。
my $a = "foo";
if ($some_condition) {
my $b = "bar";
print $a; # prints "foo"
print $b; # prints "bar"
}
print $a; # prints "foo"
print $b;  # prints nothing; $b has fallen out of scope

“my”与“use strict”关系密切,在perl脚本的首部写明语句“use strict;”,意味着解释器将在代码中寻找通用编程错误(common programming errors)。比如上例中的最后一行:"print $b",将会引发一个编译时错误,这将阻止你执行该代码。所以强烈推荐使用“strict”!

条件和循环结构
perl中含有大多数常见的条件和循环结构,除了case/switch(如果你真的需要,可以使用Switch模块,perl5.8以及更新的perl版本中含有该模块,当然也可以从CPAN上获取它。关于模块以及CPAN的详细信息请参见下文“模块”一节)。
条件可以是任意的perl表达式,对于在条件语句中经常出现的“比较运算”操作符和“逻辑运算”操作符,我们将在下一节中进行详细讲述。
if
if ( condition ) {
...
} elsif ( other condition ) {
...
} else {
...
}

还有一个if的否定版本:
unless ( condition ) {
...
}

它与“if (!condition)”完全等价,只是可读性更好。
注意,在perl中即使你在一个“块”里只写了一条语句,花括号也是必须的!(译者注:C语言在这种情况下允许你省略花括号。)然而,有一种更聪明的写法可以让你的单行条件语言块看起来更像一句英文:
# the traditional way   
if ($zippy) {
print "Yow!";
}

# the Perlish post-condition way (译者注:下面这两句看起来是不是很像英文句子?)
print "Yow!" if $zippy;
print "We have no bananas" unless $bananas;

while
while ( condition ) {
...
}

同样有while的否定版:
until ( condition ) {
...
}

你也可以使用“后附条件”(post-condition)形式的while:
print "LA LA LA\n" while 1;          # loops forever

for
与C中的for惊人的相似:
for ($i=0; $i <= $max; $i++) {
...
}

C风格的for在perl中很少被用到,因为perl提供了更友好的列表扫描循环“foreach”。

foreach
#译者注:此处有一个“隐式”赋值,即将每一个当前遍历到的数组@array中的元素赋给$_。当然你也可以“显式”地指定一个变量用于赋值。
foreach (@array){
print "This element is $_\n";
}

# you don't have to use the default $_ either...
foreach my $key (keys %hash) {
print "The value of $key is $hash{$key}\n";
}

有一些循环结构在本文中并未提及,欲了解详细信息,请参见perlsyn。

内建操作符和函数
Perl含有许多内建函数。我们在前文中已经看到了一些,比如“print”,“sort”以及“reverse”。perlfunc的开头部分列出了一张函数清单,你可以使用“perldoc –f functionname”方便地找到这些函数的资料并进行阅读。

Perl操作符的全部文档都记录在perlop中,这里我们列出了其中最常用的几个:

算术运算符
+   addition
-   subtraction
*   multiplication
/   division

数字比较运算符
==  equality
!=  inequality
<   less than
>   greater than
<=  less than or equal
>=  greater than or equal

字串比较运算符
eq  equality
ne  inequality
lt  less than
gt  greater than
le  less than or equal
ge  greater than or equal

perl为什么要将数字比较与字串比较分离呢?因为perl中没有特定的数据类型,perl需要依据运算符来确定是依据数字大小排序(这时99前在100前面)还是依据字典序排序(这时100会排在99前面)。

布尔逻辑运算符
&&  and
||  or
! not
上面列表中的and,or,not不仅仅是对操作符的一种解释,在perl中它们也可以被当作布尔逻辑运算符使用。较之C风格的操作符(&&,||,!),它们有更好的可读性,只是优先级与前者不同。详情请参阅perllp。

杂七杂八
= 赋值运算符
. 字串连接符
x 字串翻倍符(译者注:是小写字母x)
..范围操作符(可以建立数字列表)

许多操作符可以与等号结合使用:
$a += 1; # same as $a = $a + 1
$a -= 1; # same as $a = $a - 1
$a .= "\n"; # same as $a = $a . "\n";

文件与I/O操作
使用“open()”函数,你可以打开一个文件并对其进行读写操作。“open()”的详细说明可以在perlfunc和perlopentut中找到,这里只进行简要介绍:
open(INFILE,"input.txt")   or die "Can’t open input.txt: $!";
open(OUTFILE,">output.txt") or die "Can’t open output.txt: $!";
open(LOGFILE,">>my.log") or die "Can’t open logfile: $!";
(译者注:$!相当于一个字串,记录了系统给出的错误提示,相当于C中的error。)

使用“”操作符,你可以方便地对一个已打开的文件句柄进行读操作。在标量上下文中,“”从文件句柄中读出单独一行,在列表上下文中“”读出整个文件,将文件中的每行作为数组的一个元素:
my $line  = ;(译者注:此处为标量上下文,因为被赋值的是标量。)
my @lines = ;(译者注:此处为列表上下文,因为被赋值的是数组。)

一次读出整个文件的方法很有用,但是会占用大量内存。对于大部分文件,我们可以利用perl的循环结构每次处理其中的一行。

“”操作符经常出现在while循环中:
while () { # assigns each line in turn to $_
print "Just read in this line: $_";
}

我们已经知道如何用“print()”向“标准输出”作输出。然而我们还可以指定“print()”的第一个参数,由此可以让“print()”向特定的文件句柄作输出:
print STDERR "This is your final warning.\n";
print OUTFILE $record;
print LOGFILE $logmessage;

当你完成对文件句柄的所有操作后,记得用“close()”将其关闭。(老实说,如果你忘了这回事,perl对帮你善后。):
close INFILE;

正则表达式
perl对正则表达式的支持是广泛和深入的,相关主题可以在perlrequick,perlretut以及其他许多地方找到。下文只作简要介绍:

简单匹配
if (/foo/)  { ... }  # true if $_ contains "foo"   
if ($a =~ /foo/) { ... }  # true if $a contains "foo"

perlop中有对匹配操作符“//”的介绍。此算符默认对$_进行匹配操作,也可以使用捆绑“=~”操作符改变“//”的匹配对像。对关“=~”的详情请参阅perlop。

简单替换
s/foo/bar/; # replaces foo with bar in $_
$a =~ s/foo/bar/; # replaces foo with bar in $a   
$a =~ s/foo/bar/g; # replaces ALL INSTANCES of foo with bar in $a

替换操作符“s///”的详细文档可在perlop中找到。

更复杂的正则表达式
正则匹配绝不仅限于固定字串。使用正则表达式,你可以匹配任何你想像到的东西。关于这方面的详细文档请参阅perlre,在此我们只展现冰山一角:
. 通配符(译者注:代表换行\n以外有所有单个字符。)   
\s  空白符(空格,制表符\t,换行\n)(译者注:其实\s可代表5种空白--另外两种是换页\f和回车\r)
\S 非空白符
\d 数字(0-9)
\D 非数字
\w 一个字符 (a-z, A-Z, 0-9, _)
\W 一个非字符
[aeiou] 匹配集合中的任意一个单字
[^aeiou] 匹配集合以外的任何一个字符
(foo||ar||az)  匹配三个候选字串之一
^ 字串开头
$ 字串结尾

量词可以指定其前面项目出现的次数,这里“项目”可以是文字字符,上表列出的匹配符或者是由括号括起的一组字符和匹配符。
* 0个或多个前面的项目
+ 1个或多个前面的项目
? 0个或1个前面的项目
{3} 匹配3个前面的项目              
{3,6} 匹配3到6个前面的项目
{3,} 匹配3个或更多前面的项目

几个简单的例子:
/^\d+/ 以一个或多个数字开头的字串
/^$/ 空行(行首与行尾相连)
/(\d\s){3}/ 3个数字,每个数字后有一个空白(比如“3 4 5 ”)
/(a.)+/ 一个字串,奇数位置上的字符是a(比如“abacadaf”)                                 
#这个循环从STDIN中读取数据,打印空白行:
while () {
next if /^$/;
print;
}

具有保存功能的圆括号
除了分组功能外,圆括号还有第二个作用。它可以存储前一次正规表达式匹配出的结果。结果顺次存放在$1,$2…中。

#一种粗劣的解析电子邮件地址的方法
if ($email =~ /([^@])+@(.+)/) {
print "Username is $1\n";
print "Hostname is $2\n";
}

正则表达式的其他特征
perl的正则表达式还支持后向引用(backreferences),前向搜索(lookaheads),以及其他各种复杂的匹配。参阅perlrequick,perlretut,perlre可以了解更多细节。

函数
编写函数非常容易:
sub log {
print LOGFILE $logmessage;
}

“shift”的作用何在呢?传给函数的参数存储在特定的数组@_中(详情参见perlvar),同时它也是“shift”函数的默认参数。因此“my $logmessage = shift;”语句的作用是:取出参数表中的第一项将其赋给$logmessage。(译者注:shift用于从数组首部取出元素,每次一个,类似堆栈中的弹栈操作。)

我们还可以用其他方法处理@_:
my ($logmessage, $priority) = @_; # common
my $logmessage = $_[0]; # uncommon, and ugly

函数可以有返回值:
sub square {
my $num = shift;
my $result = $num * $num;
return $result;
}

想了解有关编写函数的详情,请参阅perlsub。

面向对象的perl(OO perl)
OO perl相对简单,它是以“引用”实现的。基于perl中“包”的概念,“引用”会知道你使用的是何种类型的对象。然而OO perl超出了本文的范围。详情请参阅perlboot,perltoot,perltooc和perlobj。

作为一个perl新手,你最常用的OO perl是使用第三方模块,下文会对此有所阐述。

使用perl模块
perl模块提供了丰富的功能使你免于重复开发,可以去CPAN( http://www.cpan.org/)下载各种模块,perl的发行版中包含了不少常用模块。

模块的种类很多,涉及文本处理、网络协议、数据库、图像处理等诸多方面。可以从CPAN上得到模块的分类列表。

学习模块的安装,请参阅perlmodinstall。(译者注:通常从CPAN下载的模块包中会有readme文件,里面详细说明了安装方法。)

通过“perldoc Module::Name”命令可以学习特定模块的使用。如果需要调用模块中的函数,则要在代码中输入"use Module::Name",该语句使你获得函数(或模块OO接口)的使用权。

perlfaq包含了许多常见问题及答案,并且给出了关于使用CPAN模块的良好建议。perlmod对perl模块进行了概述。perlmodlib列出了perl中已经安装的模块。如果你有编写perl模块的冲动,perlnewmod会为你提供帮助。

作者
Kirrily "Skud" Robert

译者
qmbhall(球)



1、入门资料

官网:https://www.perl.org/
论坛:https://www.perlmonks.org/
手册:https://perldoc.perl.org/perl
两个半小时入门指导:https://qntm.org/perl_en

2、知识要点

必须记住和熟练使用的知识点是下面这些。

理解perl里面的三种变量表示方式:
$ 表示单个变量,用单双引号区别,q(),qq()
@ 表示多个变量组成的数组,qw()
% 表示关系型变量,hash
变量不严格区分类型,没有int/float/double/char这样的概念。

三种变量都有对应的操作技巧:

简单变量的操作函数
Numerical operators:    <,  >, <=, >=, ==, !=, <=>, +, *
String operators:    lt, gt, le, ge, eq, ne, cmp, ., x

数组操作(pop/push/shift/unshift/splice/map/grep/join/split/sort/reverse)

hash操作方式
(keys,values,each,delete,exists)

变量内容交换,字符型转为数值型,字符串转为字符数组,字符串变量,heredoc,字符串分割,字符串截取,随机数生成,取整,各种概率分布数,多维矩阵如何操作,进制转换,hash翻转,数组转hash。

上下文环境
这个比较复杂,就是需要理解程序是如何判断你的变量的,你以为的不一定是你以为的。

正则表达式
这也是一个非常重要的一块内容,基础用法就是m和s,一个匹配,一个替换,比较有趣的就是1,2等等捕获变量。

内建变量
就是perl语言设计的时候定义了一大堆的全局变量($_ $, $0 $> $< $! $. @ARGV @F @_ @INC %ENV %SIG)
。外表上看起来都是一个$ @ %符号后面加上一大堆的奇奇怪怪的字符,表示一些特殊变量,这也是perl语言饱受诟病的原因。但是有些非常重要,懂了它之后写程序会方便。

控制语句(循环/条件/判断)
if ... elsif ... else ...
unless/while/next/last/for/foreach

读写文件
while(<>){
#do something !
}

这是我最喜欢的一个程序模板,读取文件,根据需要处理文件,然后输出。需要实现非常多的功能,然后就可以自己总结脚本技巧,也能完全掌握perl的各种语法。在生物信息学领域,需要实现的功能有!

perl 单行命令
完全代替了shell脚本里面的三剑客:awk、sed/grep系列命令。

预定义函数
perl 是一个非常精简的语言,自定义的函数非常少,连min max这样常见的函数都没有,如果需要使用这样的功能,要么自己写一个函数,要么使用加强版的包,perl的包非常多。下面列出一些常用的函数:
程序必备:use/die/warn/print/open/close/<>/
数学函数:sin/cos/log/abs/rand/srand/sqrt
字符串函数:uc/lc/scaler/index/rindex/length/pos/substr/sprintf/chop/chomp/hex/int/oct/ord/chr/unpack/unencode/defined/undef

系统操作相关
perl语言是跨平台的,因为它的执行靠的是perl解释器,而perl的解释器可以安装在任何机器上面。所以可以用perl来代替很多系统管理工作。
系统命令调用
文件句柄操作(STDIN,STDOUT,STDERR,ARGV,DATA,)
系统文件管理(mkdir/chdir/opendir/closedir/readdir/telldir/rmdir/)

一些高级技巧
自定义函数 sub , 参数传递,数组传递,返回值
模块操作(模块安装,加载,模块路径,模块函数引用)
引用(变量的变量)
选择一个好的编辑器-编译器,editplus,notepad++,jEdit,编程习惯的养成。
搞清楚perl版本的问题,还有程序编码的问题,中文显示的问题。
程序调试

perl常见模块学习
perl和LWP/HTML做网络爬虫必备,重点是DOM如何解析;
perl和CGI编程,做网站的神器,重点是html基础知识;
DBI相关数据库,用perl来操作mysql等,当然,重点是mysql知识;
GD and GD::Graph 可以用来画图,但是基本上没有人用了,除了CIRCOS画圈圈图火起来了;
TK模块,可以编写跨平台GUI界面程序;
XML/pdf/excel/Json 相关的模块可以用来读取非文本格式数据,或者输出格式化报告。


Perl 特性
借鉴了其他语言的最佳特性,例如 C、awk、sed、sh 和 BASIC 等。
数据库集成接口 DBI 支持第三方数据库,包括 Oracle、Sybase、Postgres、MySQL 等。
适用于 HTML、XML 和其他标记语言。
支持 Unicode 与兼容千年虫。
支持过程式和面向对象的编程。
通过 XS 或 SWIG 与外部 C/C++ 库交互。
是充分可扩展的。综合 Perl 存档网络 (CPAN) 提供了超过 20,000 个第三方模块。
解释器可以嵌入到其他系统中。

Perl 是一种松散类型的语言,在程序中使用时无需为数据指定类型。其解释器将根据数据本身的上下文选择类型。其具有三种基本数据类型:标量、标量数组和标量散列,也称为关联数组。

标量
标量(scalar )是简单的变量,其前面有一个美元符号($)。标量可以是数字、字符串或引用。引用实际上是变量的地址。

数组
数组(array)是标量的有序列表,可以使用从 0 开始的数字索引访问它们。它们前面有一个"at"符号(@)。

哈希
哈希(Hash)是您使用键作为下标访问的无序键/值对集。 它们前面有一个百分号(%)。

数字字面量
Perl 在内部将所有数字存储为有符号整数或双精度浮点值,(负)整数、浮点数、科学记数、(二,八,十六)进制

字符串字面量
字符串是字符序列。它们通常是由单引号(')或双引号(")分隔的字母数字值。它们的工作方式与 UNIX shell 引号非常相似,可以使用单引号字符串和双引号字符串。双引号字符串文字允许变量插值,而单引号字符串不允许。某些字符以反斜杠开头,具有特殊含义,用于表示换行 (\n)或制表符(\t);可以在双引号字符串中直接嵌入换行符或任何以下转义序列。

V-Strings
形式为 v1.20.300.4000 的文字被解析为由具有指定序数的字符组成的字符串,这种形式称为 v-strings。其提供了另一种更易读的方式来构造字符串,而不是使用可读性较差的插值形式"\x{1}\x{14}\x{12c}\x{fa0}"。

它们是任何以 v 开头并后跟一个或多个点分隔元素的文字。

my $smile = v9786;    #Unicode code point
my $foo = v102.111.111;    #字串的ASCII码
my $freeoa = v70.114.101.101.79.65;

print "smile = $smile\n";
print "foo = $foo\n";
print "FreeOA = $freeoa\n";

特殊字符

__FILE__、__LINE__ 和 __PACKAGE__ 代表你程序中那个点的当前文件名、行号和包名。

它们只能用作单独的标记,不会插入到字符串中。

print "File name ". __FILE__ . "\n";
print "Line Number " . __LINE__ ."\n";
print "Package " . __PACKAGE__ ."\n";

# they can not be interpolated
print "__FILE__ __LINE__ __PACKAGE__\n";


local 主要用于变量的当前值必须对被调用的子例程可见的情况。本地只是为全局(意味着包)变量提供临时值。这称为动态范围。词法作用域是用 my 完成的,它更像 C 的自动声明。如果给 local 一个以上的变量或表达式,它们必须放在括号中。该运算符的工作原理是将这些变量的当前值保存在其参数列表中的隐藏堆栈上,并在退出块、子例程或 eval 时恢复它们。


不能使用反斜杠运算符在 I/O 句柄(文件句柄或目录句柄)上创建引用,不确定变量类型,那么使用 ref 很容易知道它的类型,如果其参数是引用,则返回以下字符串之一。否则返回 false。
SCALAR
ARRAY
HASH
CODE
GLOB
REF

当两个引用包含对彼此的引用时,就会发生循环引用;创建引用时必须小心,否则循环引用会导致内存泄漏。

可以通过在该函数名称前加上'&'来生成对该函数的引用,并且要取消引用该引用(解引用),只需使用与符号'&'为引用变量添加前缀。下面是一个例子:
# Function definition
sub PrintHash {
   my (%hash) = @_;
   foreach $item (%hash) {
      print "Item : $item\n";
   }
}
%hash = ('name' => 'FreeOA', 'age' => 19);

# Create a reference to above function.
$cref = \&PrintHash;

# Function call using reference.
&$cref(%hash);


目录处理标准函数

opendir DIRHANDLE, EXPR  # To open a directory
readdir DIRHANDLE        # To read a directory
rewinddir DIRHANDLE      # Positioning pointer to the begining
telldir DIRHANDLE        # Returns current position of the dir
seekdir DIRHANDLE, POS   # Pointing pointer to POS inside dir
closedir DIRHANDLE       # Closing a directory.

有多种方法可以列出特定目录中的所有可用文件,可使用 glob 操作符获取并列出所有文件。

另有目录的创建、删除、更改函数:mkdir,rmdir,chdir。

Carp 模块提供了一种简化的方法来报告模块内返回有关调用脚本的信息的错误。其提供了四个函数:carp、cluck、croak和confession。

carp 函数与 warn 基本等价,它会将消息打印到 STDERR,而无需实际退出脚本并打印脚本名称。

cluck 函数是一种增压鲤鱼,它遵循相同的基本原理,但也会打印导致调用该函数的所有模块的堆栈跟踪,包括原始脚本的信息。

croak 函数等价于die,除了它向上一级报告调用者。和 die 一样,这个函数在向 STDERR 报错后也会退出脚本;与 carp 一样,根据 warn 和 die 功能,同样的基本规则适用于包含行和文件信息。

confess功能类似于cluck;它调用 die,然后一直打印到原始脚本的堆栈跟踪。


特殊变量

1、$_
各种一元函数,包括 ord 和 int 等函数,以及所有文件测试(-f、-d),但默认为 STDIN 的 -t 除外。
各种列表功能,如打印和取消链接。
模式匹配操作 m//、s/// 和 tr/// 在不使用 =~ 运算符时使用。
如果没有提供其他变量,则为 foreach 循环中的默认迭代器变量。
grep 和 map 函数中的隐式迭代器变量。
当一个 line-input 操作的结果被自己测试为 while 测试的唯一标准时,放置输入记录的默认位置(即,)。 请注意,在一段时间测试之外,这不会发生。

2、特殊变量类型
根据特殊变量的用途和性质,可以将它们分为以下几类:
全局标量特殊变量。
全局数组特殊变量。
全局哈希特殊变量。
全局特殊文件句柄。
全局特殊常量。
正则表达式特殊变量。
文件句柄特殊变量。



全局标量特殊变量

这是所有标量特殊变量的列表,列出了相应的类似英语的名称以及符号名称。

$_默认输入和模式搜索空间。
$ARG
$.读取的最后一个文件句柄的当前输入行号。 文件句柄上的显式关闭会重置行号。
$NR
$/输入记录分隔符; 默认换行。 如果设置为空字符串,它会将空行视为分隔符。
$RS
$,打印操作符的输出字段分隔符。
$OFS
$\打印操作符的输出记录分隔符。
$ORS
$"与 "$," 类似,但它适用于插入双引号字符串(或类似的解释字符串)的列表值。 默认为空格。
$LIST_SEPARATOR
$;多维数组模拟的下标分隔符。 默认为"\034"。
$SUBSCRIPT_SEPARATOR
$^L格式输出以执行换页。 默认为"\f"。
$FORMAT_FORMFEED
$:当前的字符集,在该字符集之后可能会破坏字符串以填充格式中的延续字段(以 ^ 开头)。 默认为"\n"。
$FORMAT_LINE_BREAK_CHARACTERS
$^A格式行的写入累加器的当前值。
$ACCUMULATOR
$#包含打印数字的输出格式(已弃用)。
$OFMT
$?最后一个管道关闭、反引号 (``) 命令或系统运算符返回的状态。
$CHILD_ERROR
$!如果在数字上下文中使用,则产生 errno 变量的当前值,标识最后一个系统调用错误。 如果在字符串上下文中使用,则产生相应的系统错误字符串。
$OS_ERROR 或 $ERRNO
$@最后一个 eval 命令的 Perl 语法错误消息。
$EVAL_ERROR
$$运行此脚本的 Perl 进程的 pid。
$PROCESS_ID 或 $PID
$<这个进程的真实用户ID(uid)。
$REAL_USER_ID or $UID
$>该进程的有效用户ID。
$EFFECTIVE_USER_ID 或 $EUID
$(这个进程的真实组ID(gid)。
$REAL_GROUP_ID or $GID
$)这个过程的有效gid。
$EFFECTIVE_GROUP_ID 或 $EGID
$0包含包含正在执行的 Perl 脚本的文件的名称。
$PROGRAM_NAME
$[数组中第一个元素的索引和子字符串中第一个字符的索引。 默认为 0。
$]返回版本加上补丁级别除以 1000。
$PERL_VERSION
$^D调试标志的当前值。
$DEBUGGING
$^E某些平台上的扩展错误消息。
$EXTENDED_OS_ERROR
$^F最大系统文件描述符,一般为2。
$SYSTEM_FD_MAX
$^H包含某些实用模块启用的内部编译器提示。
$^I就地编辑扩展的当前值。 使用 undef 禁用就地编辑。
$INPLACE_EDIT
$^M$M 的内容可以用作紧急内存池,以防 Perl 因内存不足错误而死机。 使用 $M 需要对 Perl 进行特殊编译。 有关详细信息,请参阅安装文档。
$^O包含编译当前 Perl 二进制文件的操作系统的名称。
$OSNAME
$^P调试器清除的内部标志,以便它不会自行调试。
$PERLDB
$^T脚本开始运行的时间,自纪元以来的秒数。
$BASETIME
$^W警告开关的当前值,true 或 false。
$WARNING
$^XPerl 二进制文件本身执行的名称。
$EXECUTABLE_NAME
$ARGV从 <ARGV> 读取时包含当前文件的名称。

全局数组特殊变量

@ARGV包含用于脚本的命令行参数的数组。
@INC包含查找 Perl 脚本的位置列表的数组,这些位置将由 do、require 或 use 构造进行评估。
@F当给出 -a 命令行开关时,输入行被分割成的数组。

全局散列特殊变量

%INC通过 do 或 require 包含的每个文件的文件名条目的哈希值。
%ENV包含您当前环境的哈希值。
%SIG用于为各种信号设置信号处理程序的哈希值。

全局特殊文件句柄

ARGV在@ARGV 中迭代命令行文件名的特殊文件句柄。 通常写为 <> 中的空文件句柄。
STDERR任何包中标准错误的特殊文件句柄。
STDIN任何包中标准输入的特殊文件句柄。
STDOUT任何包中标准输出的特殊文件句柄。
DATA引用包含脚本的文件中 __END__ 标记之后的任何内容的特殊文件句柄。或者,所需文件中 __DATA__ 标记之后的任何内容的特殊文件句柄,只要您正在读取同一包中的数据 __DATA__ 被发现。
_ (underscore)用于缓存来自最后一个 stat、lstat 或文件测试运算符的信息的特殊文件句柄。

全局特殊常量

__END__表示程序的逻辑结束。后面的任何文本都会被忽略,但可以通过 DATA 文件句柄读取。
__FILE__表示程序中使用它的位置的文件名。不插入字符串。
__LINE__表示当前行号。未插入字符串。
__PACKAGE__表示编译时的当前包名,如果没有当前包,则为 undefined。不插入字符串。

正则表达式特殊变量

$digit包含与最后匹配的模式中的相应括号集匹配的文本。例如,$1 匹配前一个正则表达式中第一组括号中包含的任何内容。
$&最后一次成功的模式匹配所匹配的字符串。
$MATCH
$`上一次成功的模式匹配所匹配的字符串之前的字符串。
$PREMATCH
$'最后一次成功的模式匹配所匹配的字符串后面的字符串。
$POSTMATCH
$+最后一个搜索模式匹配的最后一个括号。如果您不知道匹配了一组替代模式中的哪一个,这将很有用。例如: /Version: (.*)|Revision: (.*)/ && ($rev = $+);
$LAST_PAREN_MATCH

文件句柄特殊变量

$|如果设置为非零,则在当前选定的输出通道上每次写入或打印后强制执行 fflush(3)。
$OUTPUT_AUTOFLUSH
$%当前选择的输出通道的当前页码。
$FORMAT_PAGE_NUMBER
$=当前选择的输出通道的当前页面长度(可打印行)。默认为 60。
$FORMAT_LINES_PER_PAGE
$-当前选中输出通道的页面剩余行数。
$FORMAT_LINES_LEFT
$~当前选定输出通道的当前报告格式的名称。默认是文件句柄的名称。
$FORMAT_NAME
$^当前所选输出通道的当前页首格式的名称。默认是文件句柄的名称,并附加了 _TOP。
$FORMAT_TOP_NAME


编码标准建议

不要害怕使用循环标签——它们可以提高可读性并允许多级循环中断。选择助记符标识符。

避免在 void 上下文中使用 grep()(或 map())或 `backticks`,也就是说,只是丢弃它们的返回值时。这些函数都有返回值,所以使用它们;否则请改用 foreach() 循环或 system() 函数。

为了可移植性,当使用可能无法在每台机器上实现的功能时,请在 eval 中测试构造以查看它是否失败。如果知道某个特定功能实现了哪个版本或补丁级别,可以测试 $](英文为 $PERL_VERSION)以查看它是否存在。当安装 Perl 时,Config 模块还可以让您查询由 Configure 程序确定的值。

虽然像 $gotit 这样的短标识符可能没问题,但使用下划线分隔较长标识符中的单词。$var_names_like_this 通常比 $VarNamesLikeThis 更容易阅读,特别是对于非英语母语人士。这也是一个与 VAR_NAMES_LIKE_THIS 一致的简单规则。

包名称有时是此规则的一个例外。Perl 非正式地为"pragma"模块(如整数和严格)保留小写模块名称。其他模块应该以大写字母开头并使用大小写混合,但由于原始文件系统将模块名称表示为必须适合几个稀疏字节的文件的限制,可能没有下划线。

如果有一个非常复杂的正则表达式,请使用 /x 修饰符并添加一些空格以使它看起来不像线条噪音。当正则表达式有斜杠或反斜杠时,不要使用斜杠作为分隔符。

始终检查系统调用的返回码。 好的错误消息应该发送到 STDERR,包括哪个程序导致了问题,失败的系统调用和参数是什么,并且(非常重要)应该包含标准的系统错误消息,说明出了什么问题。

考虑可重用性。当可能想再次做类似的事情时,为什么要一次性浪费脑力呢? 考虑编写一个模块或对象类。考虑使用 use strict 和使用警告(或 -w)使代码干净地运行。


正则表达式

正则表达式是定义正在查看的一个或多个模式的字符串。Perl 中正则表达式的语法与其他正则表达式中的语法非常相似。支持程序如 sed、grep 和 awk。

应用正则表达式的基本方法是使用模式绑定运算符 =~ 和 !~;第一个运算符是测试和赋值运算符。Perl 中有三个正则表达式运算符。
匹配正则表达式 - m//
替换正则表达式 - s///
转换正则表达式 - tr///

每种情况下的正斜杠都充当所指定的正则表达式 (regex) 的分隔符。

替换运算符
替换运算符s///实际上只是匹配运算符的扩展,它允许将匹配的文本替换为一些新文本。基本形式是:
s/PATTERN/REPLACEMENT/;

PATTERN 是正在寻找的文本的正则表达式。REPLACEMENT 是想要用来替换找到的文本的文本或正则表达式的规范。

替换运算符修饰符
i:使匹配不区分大小写。
m:指定如果字符串具有换行符或回车符,则 ^ 和 $ 运算符现在将匹配换行符边界,而不是字符串边界。
o:仅对表达式求值一次。
s:允许使用.匹配换行符。
x:为了清晰起见,允许您在表达式中使用空格。
g:用替换文本替换所有出现的找到的表达式。
e:像 Perl 语句一样评估替换,并将其返回值用作替换文本。

Translation 运算符
Translation 与替换原则相似但不相同,其不使用正则表达式来搜索替换值:
tr/SEARCHLIST/REPLACEMENTLIST/cds
y/SEARCHLIST/REPLACEMENTLIST/cds
 

翻译将 SEARCHLIST 中所有出现的字符替换为 REPLACEMENTLIST 中的相应字符。

Translation 运算符修饰符
c:补充搜索列表。
d:删除找到但未替换的字符。
s:压缩重复的替换字符。

/d 修饰符删除与 SEARCHLIST 匹配但在 REPLACEMENTLIST 中没有相应条目的字符:

$string = 'the cat sat on the mat.';
$string =~ tr/a-z/b/d;
print "$string\n";
 
执行上述程序时,会产生以下结果 −
b b   b.

匹配边界

\b 匹配任何单词边界,由 \w 类和 \W 类之间的差异定义。因为 \w 包含一个单词的字符,而 \W 相反,这通常意味着一个单词的终止。\B 断言匹配任何不是单词边界的位置。例如:
/\bcat\b/ # Matches 'the cat sat' but not 'cat on the mat'
/\Bcat\B/ # Matches 'verification' but not 'the cat on the mat'
/\bcat\B/ # Matches 'catatonic' but not 'polecat'
/\Bcat\b/ # Matches 'polecat' but not 'catatonic'

\G 断言

'\G'断言允许从最后一次匹配发生的点继续搜索。例如在下面的代码中使用了 \G 以便可以搜索到正确的位置然后提取一些信息,而无需创建更复杂的单个正则表达式。

my $dtstr = "The time is: 12:31:02 on 3/28/23";

$dtstr =~ /:\s+/g;
my ($time) = ($dtstr =~ /\G(\d+:\d+:\d+)/);
$dtstr =~ /.+\s+/g;
my ($date) = ($dtstr =~ m{\G(\d+/\d+/\d+)});

print "Time: $time, Date: $date\n";

执行上述程序时,会产生以下结果:
Time: 12:31:02, Date: 3/28/23

\G 断言实际上只是 pos 函数的元符号等价物,因此在正则表达式调用期间可以继续使用 pos,甚至可以通过使用 pos 作为左值子例程来修改 pos 的值(以及因此 \G)。

正则表达式示例

Perl(?=!)
匹配"Perl",如果后跟一个感叹号

Perl(?!!)
匹配"Perl",如果后面没有感叹号

带括号的特殊语法

R(?#comment)
匹配"R"。其余的都是注释

R(?i)uby
匹配"uby"时不区分大小写

R(?i:uby)
同上

rub(?:y|le))
仅分组而不创建 \1 反向引用


包和模块

什么是包?
package 语句将当前命名上下文切换到指定的命名空间(符号表):
包是位于其自己的命名空间中的代码集合。
命名空间是唯一变量名的命名集合(也称为符号表)。
命名空间可防止包之间的变量名冲突。
包支持构建模块,使用时不会破坏模块自身命名空间之外的变量和函数。
包一直有效,直到调用另一个包语句,或者直到当前块或文件结束。
可以使用::包限定符显式引用包中的变量。

特殊变量 __PACKAGE__ 来获取当前的包名。


BEGIN 和 END 块
可以定义任意数量的名为 BEGIN 和 END 的代码块,它们分别充当构造函数和析构函数。
BEGIN { ... }
END { ... }
BEGIN { ... }
END { ... }

每个 BEGIN 块在 perl 脚本加载和编译之后执行,但在任何其他语句执行之前。
每个 END 块都在 perl 解释器退出之前执行。
BEGIN 和 END 块在创建 Perl 模块时特别有用。

Perl模块是定义在库文件中的可重用包,其名称与包的名称相同,扩展名为.pm。
require 和 use 函数将加载一个模块。
两者都使用 @INC 中的搜索路径列表来查找模块。
require和use函数都调用eval函数来处理代码。
底部的 1; 导致 eval 评估为 TRUE(因此不会失败)。


进程管理

可以根据需要以各种方式使用 Perl 来创建新流程,几个重要和最常用的方法如下:
1.可以使用特殊变量 $$ 或 $PROCESS_ID 来获取当前进程 ID。
2.使用上述任何方法创建的每个进程都在 %ENV 变量中维护自己的虚拟环境。
3.exit() 函数总是只退出执行该函数的子进程,而主进程作为一个整体不会退出,除非所有正在运行的子进程都已退出。
4.所有打开的句柄在子进程中都是dup()-ed,因此关闭一个进程中的任何句柄不会影响其他进程。

backstick 运算符(`...`)

执行任何 Unix 命令的最简单方法是使用 backstick 运算符。只需将命令放在 backstick 运算符中,这将导致命令执行并返回其结果。

@files = `ls -l`;
foreach $file (@files) {
   print $file;
}

执行上述代码时,它会列出当前目录中所有可用的文件和目录。

system() 函数
可以使用 system() 函数来执行任何 Unix 命令,其输出将转到 perl 脚本的输出。默认情况下是屏幕,即 STDOUT,但可以使用重定向运算符 > 将其重定向到任何文件。

当命令包含诸如 $PATH 或 $HOME 之类的 shell 环境变量时要小心。

fork() 函数

Perl 提供了一个 fork() 函数,对应于同名的 Unix 系统调用。在大多数可以使用 fork() 系统调用的类 Unix 平台上,Perl 的 fork() 简单地调用它。在某些平台(例如 Windows)上 fork() 系统调用不可用,可以构建 Perl 以在解释器级别模拟 fork()。

fork() 函数用于克隆当前进程。此调用创建一个在同一点运行同一程序的新进程。它将子pid返回给父进程,0返回给子进程,如果fork不成功则返回undef。

可以在进程中使用 exec() 函数来启动请求的可执行文件,该可执行文件将在单独的进程区域中执行,并且 exec() 将等待它完成,然后以相同的方式退出 作为该进程的退出状态。

my $pid;
#local $SIG{CHLD} = "IGNORE";
if(!defined($pid = fork())) {
   # fork returned undef, so unsuccessful
   die "Cannot fork a child: $!";
} elsif ($pid == 0) {
   print "Printed by child process with pid:$pid\n";
   exec("date") || die "can't exec date: $!";

} else {
   # fork returned 0 nor undef
   # so this branch is parent
   print "Printed by parent process with pid:$$\n";
   my $ret = waitpid($pid, 0);
   print "Completed process id: $ret\n";
}

wait() 和 waitpid() 可以作为 fork() 返回的伪进程 ID 传递。这些调用将正确等待伪进程的终止并返回其状态。如果你使用 waitpid() 函数在没有等待你的子进程的情况下分叉,将会产生并积累僵尸进程(zombie process)。在 Unix 系统上可以通过将 $SIG{CHLD} 设置为"IGNORE"来避免这种情况。

kill() 函数

Perl kill('KILL', (Process List)) 函数可用于通过将 fork() 返回的 ID 传递给伪进程来终止伪进程。

请注意,在伪进程()上使用 kill('KILL', (Process List)) 通常可能会导致内存泄漏,因为实现伪进程的线程没有机会清理其资源。

可以使用 kill() 函数向目标进程发送任何其他信号,例如以下将向进程 ID 105 和 102 发送 SIGINT:
kill('INT', 105, 102);


内置函数参考

这是标准 Perl 支持的所有重要函数的列表。

abs - 绝对值函数

accept - 接受传入的套接字连接

alarm - 安排一个 SIGALRM

atan2 - Y/X 在 -PI 到 PI 范围内的反正切

bind - 将地址绑定到套接字

binmode - 为 I/O 准备二进制文件

bless - 创建一个对象

caller - 获取当前子程序调用的上下文

chdir - 更改您当前的工作目录

chmod - 更改文件列表的权限

chomp - 从字符串中删除尾随记录分隔符

chop - 从字符串中删除最后一个字符

chown - 更改文件列表的所有权

chr - 获取这个数字代表的字符

chroot - 为路径查找创建新的根目录

close - 关闭文件(或管道或套接字)句柄

closedir - 关闭目录句柄

connect - 连接到远程套接字

continue - while 或 foreach 中可选的尾随块

cos - 余弦函数

crypt - 单向密码式加密

dbmclose - 中断绑定的 dbm 文件的绑定

dbmopen - 在绑定的 dbm 文件上创建绑定

defined - 测试一个值、变量或函数是否被定义

delete - 从哈希中删除一个值

die - 引发异常或退出

do - 将 BLOCK 变成 TERM

dump - 立即创建核心转储

each - 从哈希中检索下一个键/值对

endgrent - 使用组文件完成

endhostent - 使用 hosts 文件完成

endnetent - 使用网络文件完成

endprotoent - 使用协议文件完成

endpwent - 使用 passwd 文件完成

endservent - 使用服务文件完成

eof - 测试文件句柄的结尾

eval - 捕捉异常或编译并运行代码

exec - 放弃这个程序来运行另一个程序

exists - 测试哈希键是否存在

exit - 终止这个程序

exp - 提升 I 的幂

fcntl - 文件控制系统调用

fileno - 从文件句柄返回文件描述符

flock - 使用咨询锁锁定整个文件

fork - 像这样创建一个新进程

format - 声明一个供 write() 函数使用的图片格式

formline - 用于格式的内部函数

getc - 从文件句柄中获取下一个字符

getgrent - 获取下一个组记录

getgrgid - 获取给定组用户 ID 的组记录

getgrnam - 获取给定组名的组记录

gethostbyaddr - 根据地址获取主机记录

gethostbyname - 获取主机记录给定名称

gethostent - 获取下一个主机记录

getlogin - 返回在此 tty 登录的用户

getnetbyaddr - 获取给定地址的网络记录

getnetbyname - 获取网络记录给定名称

getnetent - 获取下一个网络记录

getpeername - 找到套接字连接的另一端

getpgrp - 获取进程组

getppid - 获取父进程ID

getpriority - 获取当前不错的值

getprotobyname - 获取协议记录给定名称

getprotobynumber - 获取协议记录数字协议

getprotoent - 获取下一个协议记录

getpwent - 获取下一个密码记录

getpwnam - 根据用户登录名获取密码记录

getpwuid - 获取给定用户 ID 的密码记录

getservbyname - 获取给定名称的服务记录

getservbyport - 获取给定数字端口的服务记录

getservent - 获取下一条服务记录

getsockname - 检索给定套接字的 sockaddr

getsockopt - 获取给定套接字上的套接字选项

glob - 使用通配符扩展文件名

gmtime - 使用格林威治时间格式将 UNIX 时间转换为记录或字符串。

goto - 创建 spaghetti 代码

grep - 定位列表中的元素,根据给定标准测试 true

hex - 将字符串转换为十六进制数

import - 将模块的命名空间修补到您自己的

index - 在字符串中查找子字符串

int - 获取数字的整数部分

ioctl - 系统相关设备控制系统调用

join - 使用分隔符将列表加入字符串

keys - 从哈希中检索索引列表

kill - 向进程或进程组发送信号

last - 提前退出一个块

lc - 返回字符串的小写版本

lcfirst - 返回一个只有下一个小写字母的字符串

length - 返回字符串中的字节数

link - 在文件系统中创建硬链接

listen - 将你的套接字注册为服务器

local - 为全局变量创建一个临时值(动态范围)

localtime - 使用本地时间将 UNIX 时间转换为记录或字符串

lock - 获取变量、子例程或方法上的线程锁

log - 检索数字的自然对数

lstat - 统计符号链接

m - 将字符串与正则表达式模式匹配

map - 对列表应用更改以获取包含更改的新列表

mkdir - 创建目录

msgctl - SysV IPC消息控制操作

msgget - 获取 SysV IPC 消息队列

msgrcv - 从消息队列接收 SysV IPC 消息

msgsnd - 将 SysV IPC 消息发送到消息队列

my - 声明和分配一个局部变量(词法作用域)

next - 过早地迭代一个块

no - 在编译时取消导入某些模块符号或语义

oct - 将字符串转换为八进制数

open - 打开文件、管道或描述符

opendir - 打开一个目录

ord - 查找字符的数字表示

our - 声明和分配一个包变量(词法作用域)

pack - 将列表转换为二进制表示

package - 声明一个单独的全局命名空间

pipe - 打开一对连接的文件句柄

pop - 从数组中删除最后一个元素并返回它

pos - 查找或设置最后/下一个 m//g 搜索的偏移量

print - 将列表输出到文件句柄

printf - 将格式化列表输出到文件句柄

prototype - 获取子程序的原型(如果有的话)

push - 将一个或多个元素附加到数组

q - 单独引用一个字符串

qq - 双引号字符串

qr - 编译模式

quotemeta - 引用正则表达式魔术字符

qw - 引用一个单词列表

qx - 反引号引用一个字符串

rand - 检索下一个伪随机数

read - 来自文件句柄的固定长度缓冲输入

readdir - 从目录句柄中获取目录

readline - 从文件中获取记录

readlink - 确定符号链接指向的位置

readpipe - 执行系统命令并收集标准输出

recv - 通过 Socket 接收消息

redo - 重新开始这个循环迭代

ref - 找出被引用事物的类型

rename - 更改文件名

require - 在运行时从库中加载外部函数

reset - 清除给定名称的所有变量

return - 尽早退出函数

reverse - 翻转字符串或列表

rewinddir - 重置目录句柄

rindex - 从右到左的子串搜索

rmdir - 删除目录

s - 用字符串替换模式

scalar - 强制标量上下文

seek - 为随机访问 I/O 重新定位文件指针

seekdir - 重新定位目录指针

select - 重置默认输出或做 I/O 多路复用

semctl - SysV信号量控制操作

semget - 获取一组 SysV 信号量

semop - SysV 信号量操作

send - 通过套接字发送消息

setgrent - 准备组文件以供使用

sethostent - 准备 hosts 文件以供使用

setnetent - 准备网络文件以供使用

setpgrp - 设置一个进程的进程组

setpriority - 设置进程的nice值

setprotoent - 准备使用协议文件

setpwent - 准备 passwd 文件以供使用

setservent - 准备服务文件以供使用

setsockopt - 设置一些套接字选项

shift - 删除数组的第一个元素,并返回它

shmctl - SysV 共享内存操作

shmget - 获取 SysV 共享内存段标识符

shmread - 读取 SysV 共享内存

shmwrite - 写SysV共享内存

shutdown - 只关闭一半的套接字连接

sin - 返回数字的正弦

sleep - 阻塞几秒

socket - 创建一个socket

socketpair - 创建一对套接字

sort - 对值列表进行排序

splice - 在数组的任意位置添加或删除元素

split - 使用正则表达式分隔符分割字符串

sprintf - 格式化打印成字符串

sqrt - 平方根函数

srand - 播种随机数生成器

stat - 获取文件的状态信息

study - 优化重复搜索的输入数据

sub - 声明一个子程序,可能是匿名的

substr - 获取或更改部分搅拌

symlink - 创建文件的符号链接

syscall - 执行任意系统调用

sysopen - 打开文件、管道或描述符

sysread - 来自文件句柄的固定长度无缓冲输入

sysseek - 在 sysread 和 syswrite 使用的句柄上定位 I/O 指针

system - 运行一个单独的程序

syswrite - 固定长度的无缓冲输出到文件句柄

tell - 获取文件句柄上的当前搜索指针

telldir - 获取目录句柄上的当前搜索指针

tie - 将变量绑定到对象类

tied - 获取对绑定变量底层对象的引用

time - 返回自 1970 年以来的秒数

times - 返回自身和子进程的经过时间

tr - 音译字符串

truncate - 缩短文件

uc - 返回字符串的大写版本

ucfirst - 返回一个只有下一个大写字母的字符串

umask - 设置文件创建模式掩码

undef - 删除变量或函数定义

unlink - 删除一个文件链接

unpack - 将二进制结构转换为普通的 perl 变量

unshift - 将更多元素添加到列表的开头

untie - 打破绑定到变量的平局

use - 在编译时加载到模块中

utime - 设置文件的最后访问和修改时间

values - 返回哈希值的列表

vec - 测试或设置字符串中的特定位

wait - 等待任何子进程终止

waitpid - 等待特定的子进程终止

wantarray - 获取当前子程序调用的 void vs scalar vs list context

warn - 打印调试信息

write - 打印格式记录

-X - 文件测试(-r、-x -w 等)

y - 音译一个字符串