这是命令 perlintro,可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
perlintro -- Perl 的简要介绍和概述
商品描述
本文档旨在让您快速了解 Perl 编程语言,
以及指向进一步文档的指针。 它旨在作为“引导”指南
那些刚接触该语言的人,并提供足够的信息让您能够
阅读其他人的 Perl 并大致了解它在做什么,或者编写自己的
简单的脚本。
本介绍性文件并不旨在完整。 它甚至不打算成为
完全准确。 在某些情况下,为了获得目标而牺牲了完美
大体思路跨越。 你是 非常 建议遵循此介绍更多
来自完整 Perl 手册的信息,其目录可以在
珀尔托克
在本文档中,您将看到对 Perl 文档其他部分的引用。
您可以使用“perldoc”命令或您使用的任何方法阅读该文档
用于阅读本文档。
在 Perl 的整个文档中,您会发现许多旨在帮助解释的示例
讨论的特征。 请记住,其中许多是代码片段而不是
比完整的程序。
这些例子往往反映了该作品作者的风格和偏好。
文档,并且可能比实际程序中的相应代码行更简短。
除非另有说明,否则您应该假设“使用严格”和“使用警告”
语句出现在“程序”的前面,并且使用的任何变量都已经
声明,即使为了使示例更易于阅读而省略了这些声明。
请注意,这些示例是由许多不同的作者在一段时间内编写的
几十年。 因此,风格和技术会有所不同,尽管一些努力已经
在相同的部分中不要将样式变化得太大。 不要考虑一种风格
比别人更好 - “有不止一种方法可以做到”是 Perl 的座右铭之一。
毕竟,在你作为程序员的旅程中,你很可能会遇到不同的风格。
什么是 is 珀尔?
Perl 是一种通用编程语言,最初是为文本操作而开发的
现在用于广泛的任务,包括系统管理、Web 开发、
网络编程、GUI 开发等。
该语言旨在实用(易于使用、高效、完整)而不是
美丽(微小,优雅,最小)。 它的主要特点是使用方便,
支持过程和面向对象 (OO) 编程,具有强大的内置
支持文本处理,并拥有世界上最令人印象深刻的集合之一
第三方模块。
在 perl、perlfaq1 和毫无疑问的其他地方给出了 Perl 的不同定义。 从
这我们可以确定 Perl 对不同的人来说是不同的东西,但是很多
人们认为它至少值得一写。
运行 Perl的 程式
从 Unix 命令行运行 Perl 程序:
perl程序名.pl
或者,将其作为脚本的第一行:
#!/usr/bin/环境 perl的
...并运行脚本 /路径/到/script.pl. 当然,它需要是可执行的
首先是“chmod 755 script.pl”(在Unix下)。
(这条起跑线假设你有 ENV 程序。 你也可以直接把路径放到
你的 perl 可执行文件,比如“#!/usr/bin/perl“)。
有关更多信息,包括其他平台(如 Windows 和 Mac)的说明
操作系统,阅读 perlrun。
安全 净
默认情况下,Perl 是非常宽容的。 为了使它更健壮,建议
使用以下几行启动每个程序:
#!/usr/bin/perl
用严格;
使用警告;
额外的两行来自 perl 的请求,以捕获代码中的各种常见问题。
他们检查不同的东西,所以你需要两者。 “use strict”捕获的潜在问题;
将导致您的代码在遇到时立即停止,同时“使用警告”;
只会给出警告(如命令行开关 -w) 并让您的代码运行。 到
阅读有关它们的更多信息,请在严格和警告处查看各自的手册页。
基本版 句法 简介
Perl 脚本或程序由一个或多个语句组成。 这些陈述只是
以直截了当的方式写在剧本中。 没有必要有一个“main()”
函数或任何类似的东西。
Perl 语句以分号结尾:
打印“你好,世界”;
注释以哈希符号开始并运行到行尾
#这是一条评论
空白是无关紧要的:
打印
“你好,世界”
;
... 除了在带引号的字符串中:
# 这将在中间打印一个换行符
打印“你好
世界”;
双引号或单引号可用于文字字符串:
打印“你好,世界”;
打印“你好,世界”;
但是,只有双引号“插入”变量和特殊字符,例如
换行符(“\n”):
print "你好,$name\n"; # 工作正常
打印 '你好,$name\n'; # 按字面打印 $name\n
数字不需要引号:
打印 42;
您可以根据您的个人情况对函数的参数使用括号或省略它们
品尝。 他们只是偶尔需要澄清优先事项。
打印(“你好,世界\n”);
打印“你好,世界\n”;
可以在 perlsyn 中找到有关 Perl 语法的更多详细信息。
Perl的 变量 类型
Perl 有三种主要的变量类型:标量、数组和散列。
标量
标量表示单个值:
我的 $animal = "骆驼";
我的 $answer = 42;
标量值可以是字符串、整数或浮点数,Perl 可以
根据需要在它们之间自动转换。 无需预先声明您的
变量类型,但您必须在第一次使用“my”关键字来声明它们
使用它们。 (这是“严格使用;”的要求之一。)
标量值可以通过多种方式使用:
打印 $animal;
print "动物是 $animal\n";
print "$answer 的平方为 ", $answer * $answer, "\n";
有许多“神奇”标量的名称看起来像标点符号或线条
噪音。 这些特殊变量用于各种目的,并被记录在案
在 perlvar 中。 您现在唯一需要了解的是 $_ ,它是“默认
变量”。它被用作 Perl 中许多函数的默认参数,以及
它是由某些循环结构隐式设置的。
打印; # 默认打印 $_ 的内容
阵列
一个数组表示一个值列表:
我的@animals = ("camel", "llama", "owl");
我的@numbers = (23, 42, 69);
我的@mixed = ("骆驼", 42, 1.23);
数组是零索引的。 以下是获取数组元素的方法:
打印 $animals[0]; # 打印“骆驼”
打印 $animals[1]; # 打印“美洲驼”
特殊变量 $#array 告诉您数组最后一个元素的索引:
打印 $mixed[$#mixed]; # 最后一个元素,打印 1.23
您可能会想使用 "$#array + 1" 来告诉您一个数组中有多少项
大批。 不要打扰。 碰巧,在 Perl 期望找到标量的地方使用 @array
值(“在标量上下文中”)将为您提供数组中的元素数:
如果 (@animals < 5) { ... }
我们从数组中得到的元素以“$”开头,因为我们得到的只是
数组中的单个值; 你要求一个标量,你得到一个标量。
从数组中获取多个值:
@动物[0,1]; # 给 ("camel", "llama");
@动物[0..2]; # give ("camel", "llama", "owl");
@animals[1..$#animals]; # 给出除第一个元素之外的所有元素
这称为“数组切片”。
您可以对列表执行各种有用的操作:
我的@sorted = sort @animals;
我的@backwards = 反向@numbers;
还有一些特殊的数组,例如@ARGV(命令行参数
您的脚本)和@_(传递给子程序的参数)。 这些记录在
珀尔瓦尔。
哈希
散列表示一组键/值对:
我的 %fruit_color = ("apple", "red", "banana", "yellow");
您可以使用空格和“=>”运算符来更好地布置它们:
我的 %fruit_color = (
苹果 => "红色",
香蕉 => "黄色",
);
要获取哈希元素:
$fruit_color{"apple"}; # 给出“红色”
您可以使用“keys()”和“values()”获取键和值列表。
我的@fruits = 键 %fruit_colors;
我的@colors = 值 %fruit_colors;
哈希没有特定的内部顺序,但您可以对键进行排序和循环
通过他们。
就像特殊的标量和数组一样,也有特殊的哈希值。 最好的
其中已知的是包含环境变量的 %ENV。 阅读所有关于它(和
其他特殊变量)在 perlvar 中。
perldata 中更完整地记录了标量、数组和散列。
可以使用引用构建更复杂的数据类型,这允许您构建
列表和哈希中的列表和哈希。
引用是一个标量值,可以引用任何其他 Perl 数据类型。 所以通过存储一个
引用作为数组或散列元素的值,您可以轻松创建列表和散列
在列表和哈希中。 以下示例显示了哈希结构的 2 级哈希
使用匿名哈希引用。
我的 $variables = {
标量 => {
描述 => "单个项目",
印记 => '$',
},
数组 => {
描述 => "项目的有序列表",
印记 => '@',
},
哈希 => {
描述 => "键/值对",
印记 => '%',
},
};
print "标量以 $variables->{'scalar'}->{'sigil'} 开头\n";
有关参考主题的详尽信息可以在 perlreftut、perllol、
perlref 和 perldsc。
请按需咨询 范围界定
在上一节中,所有示例都使用了以下语法:
我的 $var = "value";
“我的”实际上不是必需的; 你可以使用:
$var = "值";
但是,上述用法将在整个程序中创建全局变量,即
糟糕的编程习惯。 "my" 改为创建词法范围的变量。 变量
被限定在块(即一堆被花括号包围的语句)中,其中
它们被定义。
我的 $x = "foo";
我的 $some_condition = 1;
如果($some_condition){
我的 $y = "bar";
打印 $x; # 打印“foo”
打印 $y; # 打印“bar”
}
打印 $x; # 打印“foo”
打印 $y; # 什么都不打印; $y 已经超出范围
将“my”与“use strict”结合使用; 在 Perl 脚本的顶部意味着
解释器会发现某些常见的编程错误。 例如,在
上面的例子,最后的“print $y”会导致编译时错误并阻止你
运行程序。 强烈建议使用“严格”。
条件 和 循环 结构体
Perl 具有大多数常用的条件和循环结构。 从 Perl 5.10 开始,它甚至
有一个 case/switch 语句(拼写为“given”/“when”)。 请参阅 perlsyn 中的“Switch 语句”
,了解更多详情。
条件可以是任何 Perl 表达式。 请参阅下一节中的运算符列表
有关比较和布尔逻辑运算符的信息,它们常用于
条件语句。
if
如果(条件){
...
} elsif(其他条件){
...
} {
...
}
还有一个否定版本:
除非(条件){
...
}
这是作为“if (!健康)状况)”.
请注意,Perl 中需要大括号,即使您在
堵塞。 然而,有一种聪明的方法可以让你的单行条件块更
英语喜欢:
#传统方式
如果($zippy){
打印“哇!”;
}
# Perlish 后置条件方式
打印“哇!” 如果 $zippy;
打印“我们没有香蕉”,除非 $bananas;
而
而(条件){
...
}
还有一个否定版本,出于同样的原因,我们有“除非”:
直到(条件){
...
}
您还可以在后置条件中使用“while”:
打印 "LA LA LA\n" 而 1; # 永远循环
就像 C 一样:
for ($i = 0; $i <= $max; $i++) {
...
}
Perl 中很少需要 C 风格的 for 循环,因为 Perl 提供了更友好的
列表扫描“foreach”循环。
的foreach
foreach(@array){
print "这个元素是 $_\n";
}
打印 $list[$_] foreach 0 .. $max;
# 你也不必使用默认的 $_...
foreach 我的 $key (keys %hash) {
print "$key 的值为 $hash{$key}\n";
}
“foreach”关键字实际上是“for”关键字的同义词。 见“”foreach
循环“在 perlsyn”。
有关循环构造的更多详细信息(以及本概述中未提及的一些)
见 perlsyn。
内建 运营商 和 功能
Perl 带有多种内置函数。 其中一些我们已经
看到的包括“打印”、“排序”和“反向”。 在开始时给出了它们的列表
perlfunc,您可以使用“perldoc -f”轻松阅读任何给定的函数
函数名".
Perl 操作符在 perlop 中有完整的文档,但这里有一些最常见的
那些:
算术
+加法
-减法
*乘法
/师
数值比较
== 平等
!= 不等式
< 小于
> 大于
<= 小于或等于
>= 大于或等于
字符串比较
等式
不等式
它小于
gt 大于
小于或等于
ge 大于或等于
(为什么我们有单独的数字和字符串比较?因为我们没有
特殊变量类型,Perl 需要知道是否按数字排序(其中 99
小于 100)或按字母顺序(其中 100 在 99 之前)。
布尔逻辑
&& 和
|| 或者
! 不是
(“和”、“或”和“非”不仅仅在上表中作为描述
运营商。 它们本身也作为运营商得到支持。 他们更
比 C 风格的运算符可读,但与“&&”和
朋友们。 检查 perlop 以获取更多详细信息。)
其他
= 分配
. 字符串连接
x 字符串乘法
.. 范围运算符(创建数字或字符串列表)
许多运算符可以与“=”组合,如下所示:
$a += 1; # 与 $a = $a + 1 相同
$a -= 1; # 与 $a = $a - 1 相同
$a .= "\n"; # 与 $a = $a 相同。 "\n";
档 和 I / O
您可以使用“open()”函数打开文件以进行输入或输出。 它记录在
perlfunc 和 perlpentut 中的奢侈细节,但简而言之:
open(my $in, "<", "input.txt") 或者死“无法打开 input.txt: $!”;
open(my $out, ">", "output.txt") 或者死“无法打开 output.txt: $!”;
open(my $log, ">>", "my.log") or die "Can't open my.log: $!";
您可以使用“<>”运算符从打开的文件句柄中读取。 在标量上下文中它读取
文件句柄中的一行,在列表上下文中它读取整个文件,
将每一行分配给列表的一个元素:
我的 $line = <$in>;
我的@lines = <$in>;
一次读入整个文件称为 slurping。 它可能有用,但它可能是
一个记忆猪。 大多数文本文件处理可以通过 Perl 的循环一次一行完成
结构体。
"<>" 运算符最常出现在 "while" 循环中:
while (<$in>) { # 将每一行依次分配给 $_
打印“只需阅读这一行:$_”;
}
我们已经看到如何使用“print()”打印到标准输出。 但是,“打印()”
还可以采用可选的第一个参数指定要打印到的文件句柄:
print STDERR "这是你最后的警告。\n";
打印 $out $record;
打印 $log $logmessage;
处理完文件句柄后,应该“关闭()”它们(尽管说实话,
如果你忘记了,Perl 会在你之后清理):
关闭 $in 或死亡 "$in: $!";
原价 表达式
Perl 的正则表达式支持既广泛又深入,是冗长的主题
perlrequick、perlretut 和其他地方的文档。 但是,简而言之:
简单搭配
if (/foo/) { ... } # true 如果 $_ 包含“foo”
if ($a =~ /foo/) { ... } # true 如果 $a 包含“foo”
“//”匹配运算符记录在 perlop 中。 它默认在 $_ 上运行,或者
可以使用“=~”绑定运算符绑定到另一个变量(也记录在
perlop)。
简单替换
s/foo/bar/; # 用 $_ 中的 bar 替换 foo
$a =~ s/foo/bar/; # 用 $a 中的 bar 替换 foo
$a =~ s/foo/bar/g; # 用 bar 替换 foo 的所有实例
# 在 $a
"s///" 替换操作符记录在 perlop 中。
更复杂的正则表达式
您不仅必须匹配固定字符串。 事实上,你可以匹配
通过使用更复杂的正则表达式,您可以实现任何梦想。 这些是
在 perlre 中进行了大量记录,但与此同时,这是一个快速作弊
床单:
. 单个字符
\sa 空白字符(空格、制表符、换行符、
...)
\S 非空白字符
\da 数字 (0-9)
\D 一个非数字
\wa 单词字符(az, AZ, 0-9, _)
\W 一个非单词字符
[aeiou] 匹配给定集合中的单个字符
[^aeiou] 匹配给定范围之外的单个字符
集
(foo|bar|baz) 匹配任何指定的替代方案
^ 字符串开头
$ 字符串结尾
量词可用于指定您要匹配的先前事物的数量
上,其中“事物”表示文字字符,列出的元字符之一
或括号中的一组字符或元字符。
* 零个或多个以前的东西
+ 一项或多项先前的事情
? 零或前一件事
{3} 正好匹配前一个事物的 3 个
{3,6} 匹配前一个事物的 3 到 6 个
{3,} 匹配 3 个或更多前一个事物
一些简短的例子:
/^\d+/ 字符串以一位或多位数字开头
/^$/ 字符串中没有任何内容(开始和结束是
邻近的)
/(\d\s){3}/ 三位数,每个后面跟一个空格
字符(例如“3 4 5”)
/(a.)+/ 匹配一个字符串,其中每个奇数
字母是一个(例如“abacadaf”)
# 这个循环从 STDIN 读取,并打印非空行:
而 (<>) {
下一个 if /^$/;
打印;
}
捕获的括号
除了分组,括号还有第二个目的。 它们可用于捕获
正则表达式匹配的部分结果供以后使用。 结果以 1 美元、2 美元结束
等等。
# 一种将电子邮件地址分成几部分的廉价而讨厌的方法
如果 ($电子邮件 =~ /([^@]+)@(.+)/) {
打印 "用户名是 $1\n";
打印“主机名是 $2\n”;
}
其他正则表达式功能
Perl 正则表达式还支持反向引用、前瞻和各种其他复杂的
细节。 在 perlrequick、perlretut 和 perlre 中阅读有关它们的所有信息。
撰稿 子程序
编写子程序很容易:
子记录器{
我的 $logmessage = shift;
打开我的 $logfile, ">>", "my.log" or die "Could not open my.log: $!";
打印 $logfile $logmessage;
}
现在我们可以像使用任何其他内置函数一样使用子程序:
logger("我们有一个记录器子程序!");
那是什么“转变”? 嗯,子程序的参数作为特殊的
名为@_ 的数组(有关更多信息,请参阅 perlvar)。 “shift”的默认参数
函数恰好是@_。 所以“我的 $logmessage = shift;” 关闭第一个项目
参数列表并将其分配给 $logmessage。
我们也可以通过其他方式操作@_:
我的 ($logmessage, $priority) = @_; # 常见的
我的 $logmessage = $_[0]; # 不常见且丑陋
子程序也可以返回值:
子方{
我的 $num = shift;
我的 $result = $num * $num;
返回 $result;
}
然后像这样使用它:
$平方= 广场(8);
有关编写子例程的更多信息,请参阅 perlsub。
OO Perl的
OO Perl 相对简单,是使用知道什么类型的引用来实现的
object 它们基于 Perl 的包概念。 然而,OO Perl 在很大程度上超出了
本文件的范围。 阅读 perlootut 和 perlobj。
作为 Perl 初学者,您最常使用的 OO Perl 将是使用第三个
派对模块,其记录如下。
运用 Perl的 模块
Perl 模块提供了一系列功能来帮助您避免重新发明轮子,并且可以
从 CPAN 下载 ( http://www.cpan.org/ )。 一些流行的模块是
包含在 Perl 发行版中。
模块类别范围从文本操作到网络协议再到数据库
与图形的集成。 CPAN 还提供了模块的分类列表。
要了解如何安装从 CPAN 下载的模块,请阅读 perlmodinstall。
要了解如何使用特定模块,请使用“perldoc 模块::名称”. 通常你会
想“用 模块::名称”,这将使您可以访问导出的函数或 OO
模块的接口。
perlfaq 包含与许多常见任务相关的问题和答案,并且经常提供
使用好的 CPAN 模块的建议。
perlmod 一般描述 Perl 模块。 perlmodlib 列出了随附的模块
你的 Perl 安装。
如果你有写 Perl 模块的冲动,perlnewmod 会给你很好的建议。
使用 onworks.net 服务在线使用 perlintro