2022 年学习 Perl

下载编程速查表,开始学习 Perl 的强大功能。
50 位读者喜欢这篇文章。
Woman sitting in front of her computer

Ray Smith

Perl 于 1988 年初发布,是一种后现代编程语言,通常被认为是脚本语言,但它也能够进行面向对象编程。它是一种成熟的语言,拥有数以万计的库、GUI 框架、名为 Raku 的衍生语言以及活跃且充满热情的社区。其开发者以其灵活性为荣:根据其创建者 Larry Wall 的说法,Perl 不对其用户强制执行任何特定的编程风格,并且完成大多数事情的方法不止一种。

Perl 仍然像它被广泛使用时一样强大,这使其成为新手程序员尝试的绝佳语言。

[ 下载 Perl 速查表 ]

Perl 基础知识

在 Linux 和 macOS 上,您已经安装了 Perl。在 Windows 上,从 Perl 网站下载并安装它。

Perl 表达式

Perl 源代码的基本单元是表达式,它是任何返回的东西。

例如,1 是一个表达式。它返回值 1。表达式 2 返回值 2,而 a 返回字母 a

表达式可以更复杂。表达式 $a + $b 包含变量(数据的占位符)和加号 (+),这是一个数学运算符。

Perl 语句

Perl 语句由表达式组成。每个语句都以分号 (;) 结尾。

例如

$c = $a + $b;

要尝试运行您自己的 Perl 语句,请打开终端并键入

$ perl -e 'print ("Hello Perl\n");'

Perl 代码块

Perl 语句块可以用大括号 ({ }) 分组在一起。代码块是一个有用的组织工具,但它们也为数据提供作用域,您可能只需要在程序的一小部分中使用这些数据。Python 使用空格定义作用域,LISP 使用括号,而 C 和 Java 使用大括号。

变量

变量是数据的占位符。人类每天都在使用变量,而没有思考它。例如,单词“它”可以指代任何名词,因此我们将其用作方便的占位符。“找到我的手机并把它给我”实际上意味着“找到我的手机并把我的手机给我”。

对于计算机来说,变量不是一种便利,而是一种必需品。变量是计算机识别和跟踪数据的方式。

在 Perl 中,您可以通过声明变量名及其内容来创建变量。

Perl 中的变量名始终以美元符号 ($) 开头。

这些简单的语句创建了一个包含字符串“Hello”和“Perl”的变量 $var,然后将变量的内容打印到您的终端

$ perl -e '$var = "hello perl"; print ("$var\n");'

流程控制

大多数程序都需要做出决策,这些选择由条件语句和循环定义和控制。if 语句是最直观的语句之一:Perl 可以测试特定条件,并且 Perl 根据该条件决定程序的进行方式。语法与 C 或 Java 类似

my $var = 1;

if($var == 1){
  print("Hello Perl\n");
}
elsif($var == 0){
  print("1 not found");
}
else{
  print("Good-bye");
}

Perl 还具有 if 语句的简短形式

$var = 1;

print("Hello Perl\n") if($var == 1);

函数和子例程

尽可能多地重用代码是一种有益的编程习惯。这种做法减少了错误(或将错误合并到一个代码块中,因此您只需修复一次),使您的程序更易于维护,简化了程序的逻辑,并使其他开发人员更容易理解。

在 Perl 中,您可以创建一个子例程,它接受输入(存储在一个名为 @_ 的特殊数组变量中)并且可能返回输出。您可以使用关键字 sub 创建子例程,后跟您选择的子例程名称,然后是代码块

#!/usr/bin/env perl

use strict;
use warnings;

sub sum {
  my $total = 0;

  for my $i(@_){
    $total += $i;
  }

  return($total);
}

print &sum(1,2), "\n";

当然,Perl 有许多您永远不必自己创建的子例程。有些是 Perl 内置的,社区库提供了其他的。

使用 Perl 编写脚本

Perl 可以编译,也可以用作解释型脚本语言。后者是刚开始时最简单的选择,尤其是如果您已经熟悉 Python 或 shell 脚本

这是一个用 Perl 编写的简单掷骰子脚本。通读一遍,看看您是否能理解它。

#!/usr/bin/env perl

use warnings;
use strict;
use utf8;
binmode STDOUT, ":encoding(UTF-8)";
binmode STDERR, ":encoding(UTF-8)";

my $sides = shift or
  die "\nYou must provide a number of sides for the dice.\n";

sub roller {
    my ($s) = @_;

    my $roll = int(rand($s));
    print $roll+1, "\n";
}

roller($sides);

第一行告诉您的 POSIX 终端使用哪个可执行文件来运行脚本。

接下来的五行是样板包含和设置。use warnings 设置告诉 Perl 检查错误并在终端中发出关于它发现的问题的警告。use strict 设置告诉 Perl 在发现错误时不运行脚本。

这两个设置都有助于您在代码中的错误导致问题之前找到它们,因此通常最好在脚本中激活它们。

脚本的主要部分首先解析从终端启动脚本时提供的参数。在本例中,预期的参数是虚拟骰子的所需面数。Perl 将其视为堆栈,并使用 shift 函数将其分配给变量 $sides。当没有提供参数时,会触发 die 函数。

使用 sub 关键字创建的 roller 子例程或函数使用 Perl 的 rand 函数生成一个伪随机数,最大为(但不包括)作为参数提供的数字。这意味着此程序中的 6 面骰子永远不会掷出 6,但它可以掷出 0。这对计算机和程序员来说没问题,但对大多数用户来说,这很令人困惑,因此可以被认为是错误。为了在错误成为问题之前修复该错误,下一行将 1 添加到随机数,并将总数打印为骰子滚动结果。

当引用传递给子例程的参数时,您引用特殊变量 @_,它是一个数组,其中包含括号中作为函数调用一部分的所有内容。但是,当从数组中提取值时,数据将强制转换为标量(示例中的 $s 变量)。

子例程在被调用之前不会运行,因此脚本的最后一行调用自定义 roller 函数,并将命令的参数作为函数的参数提供。

将文件另存为 dice.pl 并标记为可执行文件

$ chmod +x dice.pl

最后,尝试运行它,提供一个最大数字,从中选择其随机数

$ ./dice.pl 20
1
$ ./dice.pl 20
7
$ ./dice.pl 20
20

还不错!

Perl 速查表

Perl 是一种有趣而强大的语言。虽然自 Perl 成为默认脚本语言以来,像 Python、Ruby 和 Go 这样的新兴语言吸引了很多人的注意力,但 Perl 仍然非常强大。事实上,它比以往任何时候都更好,拥有光明的未来。

下次您寻找一种更灵活、交付选项简单的语言时,请尝试 Perl 并下载速查表

标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,而且经常同时工作。
User profile image.
Dave Morriss 是一位退休的 IT 经理,居住在苏格兰爱丁堡。他曾在英国高等教育部门工作,为学生和教职员工提供 IT 服务。

5 条评论

我在我的一份工作中广泛使用了 Perl。它是一种很好的语言,我发现它相当容易学习和使用。它也非常强大。我已经使用 Bash 一段时间了,但一直在考虑回到 Perl 来编写更多更复杂的程序。我发现 Bash 是一种很棒的命令行和脚本语言,但 Perl 可以轻松完成在 Bash 中非常困难的事情。

感谢这篇精彩的文章!

如果您要写一篇名为“2022 年学习 Perl”的文章,那么您可以包含一些看起来像是在过去五年内编写的 Perl 代码。

在大多数示例中,您应该使用“say()”而不是“print()”。

您没有解释为什么在调用“sum()”时使用与号,但在调用“roller()”时却没有使用——答案是在这两种情况下都不需要与号,并且使用它只会让人感到困惑(有关更多详细信息,请参阅 https://perlhacks.com/2015/04/subroutines-and-ampersands/)。

哦,在您的示例程序中包含“use utf8”没有任何实际作用。“utf8”编译指示告诉 Perl 编译器您的源代码包含编码为 UTF8 的字符。您的所有代码都只使用 ASCII 字符——所以这只是增加了不必要的复杂性。

感谢您的有益评论,Cross 先生!

我很高兴您喜欢 say() 函数。与 print() 不同,它会自动添加换行符,因此了解它是一件很棒的事情。但是,我认为对于新手程序员来说,加强对编程中换行符的认识是有帮助的,因为当您有一个不自动包含它们的函数时,您会理解为什么需要插入 \n 或 endl 或其他内容。

显式与号是个人偏好问题。我们坚持这一点。

我们使用 UTF8 的原因与我们使用 print() 的原因相同。对于很多人来说,UTF8 不是他们会考虑的事情,所以我们使用它作为一种加强其重要性的方式。无论如何,它很快就会成为 Perl 中的默认设置,但目前我们明确地使用它。

感谢您阅读我们的文章!

用 Larry Wall 的话说:TMTOWTDI(“方法不止一种”)。

回复 作者 Dave Cross

我同意与号是个人偏好问题。但是您在一个示例中使用了与号 - &sum(1,2) - 而在另一个示例中没有使用 - roller($sides)。这是一个您没有解释的不一致之处,因此只会让该语言的新手感到困惑。他们会尝试找出更改的原因(“哦,也许如果您要将返回值传递给 print(),则需要使用 '&'”),并且会弄错。

如果您要使用与号,请保持一致。或者,向您的读者解释您如何决定是否使用与号。

您使用“use utf8”也是如此。它在您的一个完整程序中,但不在另一个程序中。而且由于您没有提及它,您的读者会感到困惑,不知道何时应该使用它。

在编写教程(尤其是针对初学者的教程)时,简洁性和一致性应该是您的座右铭。任何必要的不一致都应明确解释,任何不必要的不一致都应删除。

您可能对我的 Perl 绝对初学者教程感兴趣 - https://perlhacks.com/perl-taster/

回复 作者 sethkenlon

感谢您的提示。我认为您和我在教育方法上有所不同,但最终这对读者有利。

我很乐意在 Opensource.com 上获得更多 Perl 内容,因此如果您正在寻找另一个渠道,请与我联系。

回复 作者 Dave Cross

Creative Commons 许可协议本作品根据 Creative Commons 署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.