您正在从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
您可以使用打开()
功能。它在珀尔func和perlopentut公司,但简而言之:
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>