Perl入门指南
编辑注:这个著名的系列正在进行更新。您可能对可用的较新版本感兴趣,可在以下位置找到:
首先,一个小小的推销
目录 |
•本系列的第二部分 |
欢迎来到Perl。
Perl是脚本语言的瑞士军刀:强大而灵活。它最初由Larry Wall在1980年代末为NASA担任系统管理员的语言学家开发,作为使报告处理更简单的方法。从那时起,它已经进入了大量角色:自动化系统管理、作为不同计算机系统之间的粘合剂;当然,它是Web上最受欢迎的CGI编程语言之一。
为什么Perl在互联网出现时变得如此受欢迎?两个原因:首先,互联网上所做的很多事情都是文本,而且最好使用为文本处理设计的语言来完成。更重要的是,Perl在人们需要使用的东西时,在当时的替代品中明显更好。C语言复杂,可能会产生安全问题(特别是与不受信任的数据),Tcl可能有点尴尬,Python当时并没有站稳脚跟。
此外,Perl也是一种友好的语言。它与您的个人编程风格相得益彰。Perl的口号是“条条大路通罗马”,这对大小问题都适用。
在本系列的第一个部分,您将了解一些关于Perl的基础知识,并看到一个小样本程序。
关于操作系统的说明
在这个系列中,我将假设您正在使用Unix系统,并且您的Perl解释器位于/usr/local/bin/perl
。如果您正在运行Windows,那也行;大多数Perl代码都是平台无关的。
您的第一个Perl程序
将以下文本放入名为first.pl
的文件中
#!/usr/local/bin/perl
print "Hi there!\n";
(传统上,第一个程序应该显示Hello world!
,但我是个异端。)
现在,使用您的Perl解释器运行它。从命令行进入包含此文件的目录,并键入perl first.pl
。您应该看到
Hi there!
\n
表示“换行”字符;没有它,Perl不会自动跳转到新的文本行。
函数和语句
Perl 拥有一系列丰富的 函数。它们是 Perl 的动词,是解释器运行的命令。您可以在 Perlfunc 主页上查看所有内置函数的列表。几乎所有函数都可以接受一个由逗号分隔的 参数 列表。
print
函数是 Perl 最常用的部分之一。您可以使用它来在屏幕上显示内容或将信息发送到文件(我们将在下一篇文章中讨论)。它接受要输出的内容的列表作为其参数。
print "This is a single statement.";
print "Look, ", "a ", "list!";
Perl 程序由 语句 组成,每个语句都以分号结尾。语句不必单独一行;一行上可能有多个语句,或者一个语句可以跨越多行。
print "This is "; print "two statements.\n"; print "But this ",
"is only one statement.\n";
数字、字符串和引号
Perl 有两种基本数据类型:数字和字符串。
数字很简单;我们都处理过它们。您需要知道的是,在 Perl 中,您永远不要在数字中插入逗号或空格。总是写 10000,而不是 10,000 或 10 000。
字符串稍微复杂一些。字符串是单引号或双引号中的字符集合
'This is a test.'
"Hi there!\n"
单引号和双引号之间的区别是,单引号表示其内容应 原样 解释,而双引号表示其内容应 解释。例如,字符序列 \n
在双引号字符串中是换行符,但在单引号中则是两个字符,反斜杠和 n
。
print "This string\nshows up on two lines.";
print 'This string \n shows up on only one.';
(其他两个有用的反斜杠序列是 \t
用于插入制表符,以及 \\
用于在双引号字符串中插入反斜杠。)
变量
如果函数是 Perl 的动词,那么变量就是它的名词。Perl 有三种类型的变量:标量、数组 和 哈希。把它们想象成“东西”、“列表”和“字典”。在 Perl 中,所有变量名都由标点符号、字母或下划线以及一个或多个字母数字字符或下划线组成。
标量 是单个事物。这可能是数字或字符串。标量的名称以美元符号开头,例如 $i
或 $abacus
。您可以通过告诉 Perl 它等于什么来为标量赋值
$i = 5;
$pie_flavor = 'apple';
$constitution1789 = "We the People, etc.";
您不需要指定标量是数字还是字符串。这无关紧要,因为当 Perl 需要将标量作为字符串处理时,它会这样做;当它需要将标量作为数字处理时,它也会这样做。转换是自动发生的。(这与其他许多语言不同,在这些语言中,字符串和数字是两种不同的数据类型。)
如果您使用双引号字符串,Perl 将将您命名的任何标量变量的值插入到字符串中。这通常用于动态填充字符串
$apple_count = 5;
$count_report = "There are $apple_count apples.";
print "The report is: $count_report\n";
此代码的最终输出是 报告如下:有 5 个苹果。
。
Perl 中的数字可以使用通常的数学运算进行操作:加法、乘法、除法和减法。(顺便说一句,乘法和除法在 Perl 中用 *
和 /
符号表示。)
$a = 5;
$b = $a + 10; # $b is now equal to 15.
$c = $b * 10; # $c is now equal to 150.
$a = $a - 1; # $a is now 4, and algebra teachers are cringing.
您还可以使用特殊运算符,如 ++
、--
、+=
、-=
、/=
和 *=
。这些运算符在不需要方程式中的两个元素的情况下操作标量的值。有些人喜欢它们,有些人不喜欢。我喜欢的是它们可以使代码更清晰。
$a = 5;
$a++; # $a is now 6; we added 1 to it.
$a += 10; # Now it's 16; we added 10.
$a /= 2; # And divided it by 2, so it's 8.
Perl 中的字符串没有太大的灵活性。您可以在字符串上使用的唯一基本运算符是 连接,也就是我们所说的“组合”。连接运算符是点号。连接和加法是两件事
$a = "8"; # Note the quotes. $a is a string.
$b = $a + "1"; # "1" is a string too.
$c = $a . "1"; # But $b and $c have different values!
请记住,Perl 在需要时总是透明地将字符串转换为数字,因此要获取 $b
的值,Perl 解释器将两个字符串 "8"
和 "1"
转换为数字,然后相加。 $b
的值是数字 9。然而,$c
使用了连接,所以它的值是字符串 "81"
。
只要记住,加号 用于加法,而点号 用于字符串连接。
数组 是标量的列表。数组名以 @
开头。您通过在括号内列出其内容并用逗号分隔来定义数组
@lotto_numbers = (1, 2, 3, 4, 5, 6); # Hey, it could happen.
@months = ("July", "August", "September");
数组的元素从 0 开始 索引。 (为什么不是 1? 因为。这是计算机的事情。) 要检索数组元素,您将 @
符号替换为 $
符号,然后跟随着您想要的元素的索引位置。 (它以美元符号开头,因为您正在获取一个标量值。) 您也可以像其他标量一样就地修改它。
@months = ("July", "August", "September");
print $months[0]; # This prints "July".
$months[2] = "Smarch"; # We just renamed September!
顺便说一下,如果数组不存在,您尝试将其元素分配值时将创建它。
$winter_months[0] = "December"; # This implicitly creates @winter_months.
数组始终按相同顺序返回其内容;无论您多少次从头到尾遍历 @months
,您都会按顺序返回 July
、August
和 September
。 如果您想获取数组的长度,请使用 $#array_name
的值。这比数组元素的数量少一个。如果数组根本不存在或为空,则 $#array_name
为 -1。如果您想调整数组大小,只需更改 $#array_name
的值。
@months = ("July", "August", "September");
print $#months; # This prints 2.
$a1 = $#autumn_months; # We don't have an @autumn_months, so this is -1.
$#months = 0; # Now @months only contains "July".
哈希 在某些编程语言中称为“字典”,这正是它们的本质:一个术语及其定义,或者用更准确的话说,一个 键 和一个 值。哈希中的每个键都对应一个且仅对应一个值。哈希的名称以百分号开头,例如 %parents
。您通过用逗号分隔键和值对来定义哈希
%days_in_summer = ( "July" => 31, "August" => 31, "September" => 30 );
您可以通过引用 $hashname{key}
从哈希中获取任何值,或像任何其他标量一样就地修改它。
print $days_in_summer{"September"}; # 30, of course.
$days_in_summer{"February"} = 29; # It's a leap year.
如果您想查看哈希中的键,可以使用带有哈希名称的 keys
函数。这将返回一个包含哈希中所有键的列表。列表的顺序并不总是相同的;虽然我们可以相信 @months
总是按顺序返回 July
、August
、September
,但 keys %days_in_summer
可能会以任何顺序返回它们。
@month_list = keys %days_in_summer;
# @month_list is now ('July', 'September', 'August') !
三种类型的变量有三个不同的 命名空间。 这意味着 $abacus
和 @abacus
是两个不同的变量,而 $abacus[0]
(@abacus
的第一个元素)与 $abacus{0}
(具有键 0
的 abacus
中的值)不相同。
注释
请注意,在前面的代码示例中,我已经使用了代码注释。这些注释有助于解释特定代码片段的作用,对于您计划修改、增强、修复或再次查看的任何代码都至关重要。(也就是说,注释对于所有代码都至关重要。)
Perl 代码行中跟在 # 符号后面的任何内容都是注释。(当然,如果 # 符号出现在字符串中则除外。)
print "Hello world!\n"; # That's more like it.
# This entire line is a comment.
循环
几乎每次编写程序,您都需要使用一个 循环。 循环允许您反复运行特定的代码片段。这是编程中一般概念 流程控制 的一部分。
Perl 有几个用于流程控制的不同功能,其中最基本的是 for
循环。使用 for
函数时,您需要指定一个用作 循环索引 的变量以及一个要循环的值列表。在一对花括号内,您可以放置任何希望在循环中运行的代码。
for $i (1, 2, 3, 4, 5) {
print "$i\n";
}
这个循环将打印从 1 到 5 的数字,每个数字占一行。
定义循环的一个便捷快捷方式是使用 ..
来指定一个 数字范围。您可以将 (1, 2, 3, 4, 5) 写作 (1 .. 5)。您也可以在循环列表中使用数组和标量。尝试这段代码,看看会发生什么。
@one_to_ten = (1 .. 10);
$top_limit = 25;
for $i (@one_to_ten, 15, 20 .. $top_limit) {
print "$i\n";
}
循环列表中的项目不必是数字;您也可以轻松地使用字符串。如果哈希 %month
_has 包含月份名称和每月的天数,您可以使用 keys 函数遍历它们。
for $i (keys %month_has) {
print "$i has $month_has{$i} days.\n";
}
for $marx ('Groucho', 'Harpo', 'Zeppo', 'Karl') {
print "$marx is my favorite Marx brother.\n";
}
复利奇迹
您现在对 Perl 的了解已经足够编写一个小的、有用的程序了。每个人都喜欢金钱,所以第一个示例程序是一个复利计算器。它将打印一个(相当)格式化的表格,显示投资多年的价值。(您可以在 compound_interest.pl
上查看程序。)
程序中最复杂的一行是这一行
$interest = int (($apr / 100) * $nest_egg * 100) / 100;
$apr / 100
是利率,而 ($apr / 100) * $nest_egg
是一年中赚取的利息金额。这一行使用了 int()
函数,该函数返回标量的整数值(在去掉任何小数部分之后的值)。我们在这里使用 int()
是因为当我们将 10925 乘以 9.25% 时,结果是 1010.5625,我们必须将其四舍五入到 1010.56。为此,我们将其乘以 100,得到 101056.25,然后使用 int()
丢弃剩余的小数部分,得到 101056,然后再除以 100,以便最终结果为 1010.56。尝试自己逐步执行这个语句,看看我们如何最终得到四舍五入到分的结果。
玩一玩吧!
到目前为止,您已经对 Perl 语法有了基本的了解,并且有一些简单的玩具可以玩——print
、for
、keys
和 int
。尝试用它们编写一些简单的程序。这里有两个建议,一个简单,另一个稍微复杂一些。
- 单词频率计数器。每个单词在单词数组中出现的频率是多少?打印一份报告。(提示:使用哈希来统计每个单词的出现次数。)
- 给定一个月份和该月第一天的星期几,打印该月的日历。(记住,您需要
\n
来换行。)
标签
反馈
这篇文章有什么问题吗?请在 GitHub 上打开一个问题或拉取请求来帮助我们。