您正在从Perl 5.28.2查看此文档的版本。查看最新版本

内容

名称

perlintro——对Perl的简要介绍和概述

描述

本文档旨在为您提供Perl编程语言的快速概述,以及指向进一步文档的指针。它旨在为那些不熟悉该语言的人提供“引导”指南,并为您提供足够的信息,使您能够阅读其他人的Perl并大致了解它在做什么,或者编写自己的简单脚本。

本介绍性文件并不完整。它甚至不打算完全准确。在某些情况下,为了让人们了解总体思想,人们牺牲了完美。你是强烈地建议您按照完整的Perl手册中的介绍进行操作,其目录可在中找到珀尔托克.

在本文档中,您将看到对Perl文档其他部分的引用。您可以使用珀尔多克命令或您用来阅读此文档的任何方法。

在Perl的文档中,您可以找到许多示例来帮助解释所讨论的特性。请记住,其中许多是代码片段,而不是完整的程序。

这些示例通常反映了文档作者的风格和偏好,可能比实际程序中的相应代码行更简短。除非另有说明,否则您应该假设使用严格使用警告语句出现在“程序”的前面,并且所使用的任何变量都已声明,即使为了使示例更容易阅读而省略了这些声明。

请注意,这些例子是由许多不同的作者在几十年的时间里写的。因此,风格和技术会有所不同,尽管已经做出了一些努力,以避免在同一节中的风格差异过大。不要认为一种风格比其他风格更好——“有多种方法”是Perl的格言之一。毕竟,在你作为一名程序员的旅程中,你很可能会遇到不同的风格。

什么是Perl?

Perl是一种通用编程语言,最初是为文本操作开发的,现在用于广泛的任务,包括系统管理、web开发、网络编程、GUI开发等。

语言的目的是实用(易于使用、高效、完整),而不是美观(微小、优雅、简约)。它的主要特点是易于使用,支持过程和面向对象(OO)编程,对文本处理有强大的内置支持,并且拥有世界上最令人印象深刻的第三方模块集合之一。

Perl的不同定义见珍珠,perlfaq1型毫无疑问,还有其他地方。从这里我们可以确定Perl对于不同的人来说是不同的,但很多人认为它至少值得一写。

运行Perl程序

要从Unix命令行运行Perl程序:

perl程序名.pl

或者,将此作为脚本的第一行:

#!/usr/bin/env-perl文件

…并将脚本运行为/路径/to/script.pl。当然,它首先需要是可执行的,所以chmod 755脚本.pl(在Unix下)。

(此起始行假设您具有环境价值程序。您还可以直接放置perl可执行文件的路径,如#!/usr/bin/perl).

有关更多信息,包括Windows和Mac OS等其他平台的说明,请阅读珀尔伦.

安全网

默认情况下,Perl非常宽容。为了使其更健壮,建议用以下行开始每个程序:

#!/usr/bin/perl使用严格;使用警告;

另外两行请求perl捕获代码中的各种常见问题。他们检查不同的东西,所以你需要两者。被发现的潜在问题使用严格;将导致代码在遇到时立即停止,而使用警告;只会发出警告(就像命令行开关-周)让代码运行。要了解更多有关它们的信息,请查看它们各自的手册页面严格的警告.

基本语法概述

Perl脚本或程序由一个或多个语句组成。这些语句只是以简单明了的方式写在脚本中。没有必要有main()功能或诸如此类的东西。

Perl语句以分号结尾:

打印“Hello,world”;

注释以散列符号开头,一直排到行尾

#这是一条评论

空白无关:

打印“你好,世界”;

…除引号内的字符串外:

#这将在中间打印换行符打印“Hello”世界”;

文字字符串可以使用双引号或单引号:

打印“Hello,world”;打印“Hello,world”;

然而,只有双引号“插入”变量和特殊字符(如换行符)(\n个):

打印“Hello,$name\n”;#工作正常打印“Hello,$name\n”;#按字面意思打印$name

数字不需要引号:

打印42;

您可以使用括号作为函数的参数,也可以根据个人喜好省略它们。他们只是偶尔需要澄清优先权问题。

打印(“Hello,world\n”);打印“Hello,world\n”;

有关Perl语法的更多详细信息,请参阅珍珠合成器.

Perl变量类型

Perl有三种主要的变量类型:标量、数组和散列。

标量

标量表示单个值:

my$animal=“骆驼”;我的$答案=42;

标量值可以是字符串、整数或浮点数,Perl将根据需要在它们之间自动转换。无需预先声明变量类型,但必须使用我的第一次使用时使用关键字。(这是使用严格;.)

标量值可以用多种方式使用:

打印$animal;打印“动物是$animal”;打印“$answer的平方是”,$answer*$answers,“\n”;

有许多名称看起来像标点符号或行噪声的“神奇”标量。这些特殊变量用于各种目的,并记录在佩尔瓦尔。你现在唯一需要了解的是$_这是“默认变量”。它被用作Perl中许多函数的默认参数,并由某些循环构造隐式设置。

打印;#默认情况下打印$_的内容
阵列

数组表示值列表:

my@animations=(“骆驼”、“美洲驼”、“猫头鹰”);my@numbers=(23,42,69);my@mixed=(“骆驼”,42,1.23);

阵列是零诱导的。以下是如何获取数组中的元素:

打印$animals[0];#打印“驼色”打印$animals[1];#打印“骆驼”

特殊变量$#数组告诉您数组最后一个元素的索引:

打印$mixed[$#mixed];#最后一个元素,打印1.23

你可能会想用$#数组+1告诉您一个数组中有多少项。不用麻烦了。当它发生时,使用@阵列Perl希望找到标量值的位置(“在标量上下文中”)将提供数组中元素的数量:

如果(@animals<5){…}

我们从数组中获取的元素以$因为我们只是从数组中得到一个值;如果要求标量,就会得到标量。

要从数组中获取多个值,请执行以下操作:

@动物[0,1];#给予(“骆驼”、“美洲驼”);@动物[0..2];#gives(“骆驼”、“骆驼“、“猫头鹰”);@动物[1..$#animals];#给出除第一个元素以外的所有元素

这称为“数组切片”。

您可以对列表执行各种有用的操作:

my@sorted=sort@animals;my@backwards=reverse@numbers;

还有一些特殊的数组,例如@ARGV公司(脚本的命令行参数)和@_(传递给子例程的参数)。这些记录在佩尔瓦尔.

哈希

哈希表示一组键/值对:

my%ruit_color=(“苹果”,“红色”,“香蕉”,“黄色”);

您可以使用空白和=>操作员将其布置得更精细:

我的%ruit_color=(苹果=>“红色”,香蕉=>“黄色”,);

要获取散列元素:

$ruit_color{“苹果”};#给出“红色”

您可以使用获取键和值列表按键()值().

my@fruists=keys%fruit_colors;my@colors=values%ruit_colors;

哈希没有特定的内部顺序,但您可以对键进行排序并对其进行循环。

就像特殊的标量和数组一样,也有特殊的散列。其中最著名的是%ENV公司其中包含环境变量。阅读有关它(和其他特殊变量)的所有信息佩尔瓦尔.

标量、数组和散列在珍珠数据.

可以使用引用构造更复杂的数据类型,这允许您在列表和哈希中构建列表和散列。

引用是标量值,可以引用任何其他Perl数据类型。因此,通过将引用存储为数组或散列元素的值,您可以轻松地在列表和散列中创建列表和散播。下面的示例显示了使用匿名哈希引用的哈希结构的2级哈希。

我的$变量={标量=>{description=>“单个项目”,符号=>“$”,},数组=>{description=>“有序项目列表”,符号=>“@”,},散列=>{description=>“键/值对”,符号=>“%”,},};print“标量以$variables->{'scalar'}->{'sigil'}\n”;

有关参考文献主题的详尽信息,请参阅perlreftut公司,珍珠糖,perlref公司珍珠棉.

变量范围

在上一节中,所有示例都使用了语法:

my$var=“value”;

这个我的实际上不需要;您可以使用:

$var=“值”;

然而,上述用法会在整个程序中创建全局变量,这是不好的编程实践。我的而是创建词汇范围的变量。变量的作用域是定义它们的块(即由花括号包围的一组语句)。

我的$x=“foo”;我的$some_condition=1;if($some_condition){my$y=“bar”;打印$x;#打印“foo”打印$y;#打印“条形图”}打印$x;#打印“foo”打印$y;#不打印任何内容$y已超出范围

使用我的使用严格;在Perl脚本的顶部,意味着解释器会发现某些常见的编程错误。例如,在上面的示例中打印$y将导致编译时错误并阻止您运行程序。使用严格的强烈推荐使用。

条件和循环构造

Perl具有大多数常见的条件和循环构造。从Perl 5.10开始,它甚至有一个case/switch语句(拼写为鉴于/什么时候). 请参见perlsyn中的“Switch语句”了解更多详细信息。

条件可以是任何Perl表达式。有关比较运算符和布尔逻辑运算符的信息,请参阅下一节中的运算符列表,这些运算符通常用于条件语句。

如果
if(条件){...}elsif(其他条件){...}其他{...}

还有一个否定版本:

除非(条件){...}

这是作为更可读的版本提供的如果(!条件).

请注意,在Perl中需要大括号,即使块中只有一行。然而,有一种聪明的方法可以使单行条件块更像英语:

#传统的方式if($zippy){打印“哟!”;}#Perlish后处理方式如果$zippy;则打印“哟!”;打印“我们没有香蕉”,除非$bananas;
虽然
while(条件){...}

还有一个否定版本,原因与我们有相同除非:

直到(条件){...}

您还可以使用虽然在后置条件下:

在1;#时打印“LA LA LA\n”永远循环
对于

与C:一模一样

for($i=0;$i<=$max;$i++){...}

Perl中很少需要C风格的for循环,因为Perl提供了更友好的列表扫描foreach公司循环。

foreach公司
foreach(@array){打印“此元素是$_\n”;}为每个0打印$list[$_]$最大值;#您也不必使用默认的$_。。。foreach my$key(keys%hash){打印“$key的值是$hash{$key}\n”;}

这个foreach公司关键字实际上是对于关键字。请参见perlsyn中的“Foreach循环”.

有关循环结构(以及本概述中未提及的一些结构)的更多详细信息,请参见珍珠合成器.

内置运算符和函数

Perl附带了多种内置函数。我们已经看到的一些例子包括打印,分类颠倒。它们的列表在珀尔func通过使用,您可以很容易地阅读任何给定的函数perldoc-f文件函数名.

Perl运算符在珍珠岩,但以下是一些最常见的:

算术
+添加-减法*乘法/划分
数字比较
==相等!=  不平等<小于>大于<=小于或等于>=大于或等于
字符串比较
等式相等ne不等式它小于gt大于le小于或等于ge大于或等于

(为什么我们有单独的数字和字符串比较?因为我们没有特殊的变量类型,Perl需要知道是按数字排序(其中99小于100)还是按字母排序(其中100在99之前)。

布尔逻辑
&&和||或!   

(,不只是在上表中作为操作符的描述。他们本身也被支持为操作员。它们比C样式的操作符更易读,但具有不同的优先级&&和朋友。检查珍珠岩了解更多详细信息。)

其他
=赋值.string串联x字符串乘法..范围运算符(创建数字或字符串列表)

许多运算符可以与=如下:

$a+=1;#与$a=$a+1相同$a-=1;#与$a=$a-1相同美元=“\n”;#与$a=$a相同。“\n”;

文件和I/O

您可以使用打开()功能。它在珀尔funcperlopentut公司,但简而言之:

open(my$in,“<”,“input.txt”)或die“Can not open input.text:$!”;open(my$out,“>”,“output.txt”)或die“Can not open output.text:$!”;open(my$log,“>>”,“my.log”)或die“Can not open my.log:$!”;

您可以使用<>操作员。在标量上下文中,它从文件句柄中读取一行,在列表上下文中读取整个文件,并将每一行指定给列表的一个元素:

我的$line=<$in>;my@lines=<$in>;

一次阅读整个文件被称为诋毁。它可能有用,但可能会占用内存。大多数文本文件处理都可以使用Perl的循环构造一次完成一行。

这个<>运算符最常见于虽然循环:

while(<$in>){#依次将每一行赋值给$_打印“Just read in this line:$_”;}

我们已经了解了如何使用打印到标准输出打印()然而,打印()也可以采用可选的第一个参数,指定要打印到的文件句柄:

打印STDERR“这是您的最后警告。\n”;打印$out$record;打印$log$logmessage;

完成文件句柄后,您应该关闭()它们(老实说,如果您忘记了,Perl会在您之后进行清理):

关闭$in或死亡“$in:$!”;

正则表达式

Perl的正则表达式支持既广泛又深入,并且是中冗长文档的主题珍珠岩,珍珠岩以及其他地方。然而,简而言之:

简单匹配
if(/foo/){…}#true if$_包含“foo”if($a=~/foo/){…}#true,如果$a包含“foo”

这个//匹配运算符记录在珍珠岩。它在$_默认情况下,或可以使用=~绑定运算符(也记录在珍珠岩).

简单替换
s/foo/bar/;#用中的条替换foo$_$a=~s/foo/bar/;#将$a中的foo替换为bar$a=~s/foo/bar/g;#将foo的所有实例替换为bar#单位:美元

这个秒///替换运算符记录在珍珠岩.

更复杂的正则表达式

你不必只在固定字符串上进行匹配。事实上,您可以通过使用更复杂的正则表达式来匹配您梦想中的任何内容。这些都在珍珠岩,但在此期间,这里有一个快速备忘单:

.单个字符\是空白字符(空格、制表符、换行符、,...)\S非空白字符\数字(0-9)\D为非数字\w单词字符(a-z,a-z,0-9,_)\W为非单词字符[aeiou]匹配给定集中的单个字符[^aeiou]匹配给定之外的单个字符设置(foo|bar|baz)匹配任何指定的备选方案^字符串的开头$字符串结尾

量词可用于指定要匹配的前一事物的数量,其中“事物”表示文字字符、上面列出的一个元字符或括号中的一组字符或元字符。

*前一项的零或更多+前一件事中的一件或多件?                   零个或前一个{3} 正好匹配前面的3个{3,6}匹配前面的3和6{3,}匹配前面的3个或更多

一些简短示例:

/^\d+/string以一个或多个数字开头/^$/字符串中没有任何内容(开始和结束为相邻)/(\d\s){3}/三位数字,每一位后跟一个空格字符(例如“3 4 5”)/(a.)+/匹配一个字符串,其中每个奇数字母是a(例如“abacadaf”)#此循环读取STDIN,并打印非空行:而(<>){下一个条件是/^$/;打印;}
用于捕获的括号

除了分组之外,括号还有第二个用途。它们可以用于捕获regexp匹配部分的结果,供以后使用。结果以$1,$2等等。

#将电子邮件地址拆分为多个部分的廉价而肮脏的方法如果($email=~/([^@]+)@(.+)/){打印“用户名为$1\n”;打印“主机名为$2\n”;}
其他regexp功能

Perl regexp还支持反向引用、lookaheads和各种其他复杂细节。阅读有关他们的所有信息珍珠岩,珍珠岩、和珍珠岩.

编写子例程

编写子程序很容易:

子记录器{my$logmessage=移位;打开我的$logfile、“>>”、“my.log”或die“无法打开my.log:$!”;打印$logfile$logmessage;}

现在,我们可以像使用任何其他内置函数一样使用子例程:

logger(“我们有一个logger子例程!”);

那是什么转移? 好的,子程序的参数是作为一个特殊数组提供的,该数组名为@_(请参见佩尔瓦尔更多信息)。的默认参数转移函数恰好是@_.所以my$logmessage=移位;从参数列表中移出第一项并将其赋值给$logmessage(日志消息).

我们可以操纵@_在其他方面:

my($logmessage,$priority)=@_;#常见的我的$logmessage=$_[0];#不寻常,丑陋

子例程还可以返回值:

次正方形{my$num=班次;我的$result=$num*$num;返回$result;}

然后像这样使用:

$sq=平方(8);

有关编写子例程的更多信息,请参见珀尔苏布.

OO Perl语言

OO Perl相对简单,它是通过引用实现的,这些引用知道它们是基于Perl的包概念的哪种对象。然而,OO Perl在很大程度上超出了本文的范围。阅读珍珠岩珀罗布吉.

作为一名初级Perl程序员,OOPerl最常见的用法是使用第三方模块,这些模块将在下面进行说明。

使用Perl模块

Perl模块提供了一系列功能来帮助您避免重蹈覆辙,可以从CPAN下载(http://www.cpan.org/). Perl发行版本身包含许多流行的模块。

模块的类别从文本操作到网络协议,再到数据库集成,再到图形。CPAN还提供了模块的分类列表。

要了解如何安装从CPAN下载的模块,请阅读perlmodinstall公司.

要学习如何使用特定模块,请使用珀尔多克模块::名称。通常您会希望使用模块::名称,这样您就可以访问导出的函数或模块的OO接口。

珀尔法克包含与许多常见任务相关的问题和答案,并经常为良好的CPAN模块提供使用建议。

珀尔莫德概述了Perl模块。perlmodlib列出了Perl安装附带的模块。

如果您有编写Perl模块的冲动,珀尔纽莫德会给你很好的建议。

作者

基里·罗伯特<skud@cpan.org>