20

我使用 Perl 的时间已经够长了,以至于它的许多特性已成为我的第二天性。当新程序员加入我们的团队时,他们通常几乎没有 Perl 经验,而我的任务通常是培训他们(在必要的范围内)。我想知道在培训刚接触 Perl 但有其他语言经验的程序员时应该关注什么(这个问题与语言无关,但我合作过的大多数开发人员都来自 Java)。

我想到了几件事:

  • 符文的正确使用
  • 引用/取消引用
  • 使用列表函数,如mapgrepsort

在帮助程序员过渡到 Perl 时,您发现有什么特别有用的地方吗?您是否强调相同点或不同点,或者两者都同等重要?

4

19 回答 19

20

查看我的书的目录。学习 Perl中级 Perl都旨在教程序员 Perl 语言。我们涵盖了大多数人一直使用的 80% 的 Perl,并通过多年教授 Perl 的经验发展起来。每本书都设计为教程,每章末尾都有练习。我还编写了Learning Perl Student Workbook来提供额外的练习。编程 Perl也是一个很好的参考。

实际上,要“获得” Perl,您需要了解的规则很少,而且大多数人仅通过查看代码并不能正确理解这些规则。教来自另一种语言的新 Perlers 的一些事情:

  • 严格和警告
  • 标量与列表上下文
  • 动态与词法作用域
  • 印记不是变量类型
  • 列表创建和操作(map、grep、排序)
  • 如何有效地使用 CPAN
  • 闭包和子程序作为数据
  • Perl 中的递归很糟糕

祝你好运 :)

于 2008-09-26T21:20:44.737 回答
14

我认为 Perl 的“杀手级应用”是CPAN ……</p>

第一次浏览CPAN后的典型语录:

“你有什么图书馆?”
Extirpate HTML必须是有史以来最好的函数名称!”
“你可以用 Perl总结文本吗?”

一旦程序员看到做困难的事情是多么容易,他们就会被卖掉。

然后你可以给他们看perldocCamel

于 2008-09-26T20:29:08.950 回答
11

我拥有并管理Perl Training Australia。我教 Perl 大约八年,教计算机科学十多年。我不仅对 Perl 有强烈的看法,而且对教学和总体呈现也有强烈的看法。我已经写了数百页关于 Perl 的文章——我不会在这里重复——所以我要给你的不是关于教 Perl 的建议;而是关于 Perl 的建议。它是元建议。

首先,如果您的时间和预算允许,请考虑让您的员工参加专业的 Perl 培训课程。专门课程的优点是不会出现工作中断,不会出现工作场所政治问题,而且配备非常熟悉人们在学习 Perl 时遇到的困难的人。请确保您有一位了解他们的知识并且是 Perl 社区的活跃成员的培训师;这意味着他们应该能够回答向他们提出的任何问题,或者将提问者引导至适当的参考资料,以便他们了解更多信息。是的,我经营 Perl 培训业务,所以我在这里很固执己见。

如果由于某种原因您不能参加专门的课程,那么请买一本专门设计用来教人们如何使用 Perl 编程的书,然后逐步完成。很容易错过一些东西,或者尝试以错误的顺序介绍东西,或者(天堂禁止)教坏习惯,所有这些都会让你的生活变得困难。编写旨在教授 Perl 的书籍的人通常与成功开展 Perl 培训业务的人相同。如果你想买一本书,我推荐最新版本的Learning Perl。如果您想下载一本书,我建议您从Perl Training Australia 网站获取Programming Perl课程笔记。

这两本书都附有练习,这让我想到了我的最后一条元建议。确保任何正在学习 Perl的人都做这些练习。学习任何新技能时,很容易认为自己知道发生了什么,但发现将事情付诸实践时,它比看起来更难。Perl 尤其如此,其中可以应用诸如“上下文”之类的编程概念,这在其他语言中很少见。通常这些练习是专门为教授某种技能或突出某个陷阱而设计的;在学习过程中弄清楚这些事情比在项目截止日期前夕弄清楚要容易得多。

于 2008-09-27T13:00:40.143 回答
8

我首先告诉他们要始终使用魔法咒语:

use strict;
use warnings;

他们不需要知道为什么(还)。

接下来,我将向他们介绍 perldoc 并向他们展示使用它的基础知识(-f 和 -q 标志、perldoc perl 和 perldoc perltoc 等)。当他们有问题时,他们需要知道去哪里寻找。

我会谈论标量与列表上下文。

我将向他们介绍基本数据类型(标量、数组和散列)以及符号如何遵循上下文,而不是数据类型!

介绍$_@_。理解这一点至关重要,$_因为它在很多地方都使用过,而且通常是隐含的。@_是编写子程序必不可少的。其他标点符号变量的使用频率要低得多,可以等待。

向他们介绍正则表达式并让他们习惯正则表达式是 Perl 中的一流对象的想法。

我将简要地向他们展示 Perl 的“对角线”语法。一旦你使用它们,像这样的习语next unless /foo/就很棒,但当来自其他语言时,特别是“正交”语言,它们看起来很陌生。

您无需立即谈论参考。让它等到他们准备好做需要数据结构的事情。函数mapgrep可以等待。

在基础上打下坚实的基础。让他们先一步,然后混合更高级的功能和习语。

于 2008-09-26T20:36:59.150 回答
7

您可以向他们展示的最重要的事情是如何访问文档以及如何找到它(perldoc perltoc,perldoc -q $keywordperldoc -f $function)。

Perl 附带了很好的文档,包括参考和教程式的材料。让新来者可以使用它是您可以为他们做的最有效的事情。

于 2008-09-26T20:23:44.673 回答
7

另一个令人惊讶的方面是上下文。函数甚至变量的行为取决于它们是在列表还是标量(或 void)上下文中引用,这一事实对于 Perl 学员来说是一个重要的细节。

我通常坚持使用“更高级别”的内置函数(map、grep、splice、split)。由于 TMTOWTDI,许多程序员只记得 Perl 更熟悉的方面(如 C 风格的循环、substr 和索引)并专门使用这些方面。

在他们熟悉该语言之后,中级 Perl高级 Perl 编程可以让他们进一步了解 Perl 的世界

于 2008-09-26T21:17:18.443 回答
6

可能不完全是您正在寻找的东西。提前道歉。

除非确实有必要,否则我不会指出相似之处。
Perl 在它自己的世界里工作。如果你愿意,你可以用 Java 风格编写 Perl,但有什么意义呢?

我从 Perl(和我的 Perl 导师)那里学到的最重要的一课是“有不止一种方法可以做到”。所以我认为学习 Perl 的最好方法是接受它对编程的态度,并在每个程序员找到自己的方式时支持他或她。

您正在制作的示例、列出函数等,都是使用时自然而然的东西——只有在您掌握了 Perl 的“事物方式”后,您才能理解它们的强大功能。

只是我的两分钱。

于 2008-09-26T20:13:44.227 回答
6

坦率地说,我只是给他们骆驼。这是一本易读且有趣的书,它们很快就会启动并运行。我仍然在嘲笑“Perl 认为真理是不言而喻的”,而且距离我第一次阅读它已经有十年了。

于 2008-09-26T20:41:18.467 回答
4

我是一名 Java 程序员,最近不得不学习 Perl。我发现最难习惯的部分是所有特殊的内置变量,如 $_ $~ $' 等等。在您习惯它们之前,很难跟踪哪个人做了什么。

当然,还有正则表达式的使用。

例如,我必须维护代码,当我第一次看到下面的行时,有点混乱。作为一个 java 程序员,它看起来像胡言乱语。

next unless "$_" !~ /^#/;
于 2008-09-26T20:13:09.533 回答
4

我只能补充一点,来自表达力较差的语言的人可能不理解哈希表达式或哈希和数组切片表达式。如今,似乎每种语言都有一个 PCRE 库。

哦,再加上莫里茨的想法,我就这一点对我的同事进行了辅导。

另外,我包括了一些关于 Data::Dumper、Scalar::Util、List::Util 和一些非常有用的模块的说明。

为什么不这样做呢,请查看 Damian 的Perl 最佳实践并获得一些更强大的建议。

于 2008-09-26T21:24:05.587 回答
3

我会选择各种引用运算符(来自 perlop):

       Customary  Generic        Meaning        Interpolates
           ''       q{}          Literal             no
           ""      qq{}          Literal             yes
           ``      qx{}          Command             yes*
                   qw{}         Word list            no
           //       m{}       Pattern match          yes*
                   qr{}          Pattern             yes*
                    s{}{}      Substitution          yes*
                   tr{}{}    Transliteration         no (but see below)
           <<EOF                 here-doc            yes*

           * unless the delimiter is ''.

该列表可能会让人不知所措(尤其是当您添加备用分隔符时),但非常有用。它在阅读代码时也很有帮助,因为很少(如果有的话!)语言具有 Perl 所具有的各种引号。

于 2008-09-26T20:18:05.963 回答
2

这是一个细节,不是对您问题的完整答案,但对我来说,真正转向 Perl 的人的标志是替换这个成语的人:

for (my $i = 0; $i < @a; $i++)
{
  &do_something_with($array[$i]);
}

用这个成语:

foreach my $a (@array)
{
  &do_something_with($a);
}

教他们将列表作为列表,而不仅仅是作为数组。教授令人敬畏的数据结构。教列表、散列、散列列表、列表散列、散列散列。与大多数传统的强类型语言相比,这就是最大的进步。(具有讽刺意味的是,在我今年加入的 Java 商店中,我们使用大量任意深度的嵌套 HashMap 结构。事实上,太多了;我是主张少做一点的人!但在 Perl 中,这类事情至关重要。)

于 2008-09-26T20:33:55.177 回答
2

只是开玩笑,但无论你做什么,最后都展示这样的东西!;)

use integer;@A=split//,<>;sub R{for$i(0..80){next if$A[$i];my%t=map{$_/9
==$i/9||$_%9==$i%9||$_/27==$i/27&&$_%9/3==$i%9/3?$A[$_]:0=>1}0..80;R($A[
$i]=$_)for grep{!$t{$_}}1..9;return$A[$i]=0}die@A}R
于 2008-09-26T20:48:44.567 回答
2

正如其他人所说:

use strict;
use warnings;

也许

use diagnostics;

对于 Java 程序员:

use autodie; #or Fatal

English.pm
Moose/Mouse
Perl::Critic
perltidy

于 2008-10-02T20:35:11.443 回答
1

我刚刚被雇用到这个确切的场景中。我是一名 C++ 和 Java 开发人员,在我目前的工作之前从未接触过 Perl。也需要一些时间才能使用的东西是特殊的 Perl 语法选择 [$_]、$this = that unless ... 以及只见树木不见森林(任何包含 /^#+\d/ 元素的东西)。其他事情只是我工作的编程公司的结果[混淆了 OO 语句、$self 和把 1; 在模块文件的末尾]。

现在我在这里已经有一段时间了,即使在我的非工作项目中,我也看到了 Perl 赋予我的风格元素。您以不同的方式处理任务,尤其是数据按摩,感觉就像是我工具箱中真正可靠的工具。

尽管如此,我得到了一个大约 35,000 行的代码库,这是一本骆驼书,并告诉我不能使用 CPAN。这是富有成效的六个月。^^

于 2008-10-02T20:45:16.270 回答
1

Programming Perl(由#22483合着——Randal 干得好,我的已经用了将近 10 年了)是 Perl 的一个很好的介绍。从正则表达式、切片和切块数组、关联数组等开始。再加上在 Perl 中报告的原因和方法以及函数参考。

我不确定它在第三版中有多少变化,但我会以此为基础开设一门课程并将其用作教科书。它相当简洁且切中要害。另外,您的课程与您的文档相匹配。

于 2008-10-08T07:45:31.443 回答
1

根据我在工作场所的经验,我建议从 Perl 的文档开始(这里已经介绍过),然后花一些时间向学生展示如何在命令行上测试代码。真令人惊讶,当人们可以快速尝试某件事并进行更正直到正确为止时,他们能如此迅速地掌握一门语言。

于 2008-11-25T22:37:33.683 回答
0

对于 C++/Java/C# 编码器,我预先非常强调的两个区别是:

第 1 点:在 Perl 中,几乎所有事物都有其含义,只是并不总是您想要的。很好的例子包括:

  • 没有符号的变量名不会停止执行 - 它们被解释为裸词
  • 尝试将数组存储在标量中,然后得到长度
  • 尝试将哈希存储在标量中,您会得到“a/b”(正在使用的存储桶与总存储桶?)

第 2 点:在 Perl 中,您可以随心所欲地弥补。在其他作品中,您可以说“在哈希 'w' 中,键 'x' 索引一个匿名数组,其中框 'y' 包含 'z'”,并且解释器将在您进行时为您创建和调整所有变量的大小。

于 2008-09-26T20:27:13.180 回答
0

行。当然你需要在某些时候使用 strict 。并且确定您想在某些时候使用库。但是 strict 只是 Perl 的基本启动文件魔法,每种语言都有库。我不认为这些是刚开始学习时非常重要的东西。

当您开始使用 Perl,但已经了解其他语言时,您需要了解一些疯狂的特质,例如 $a 和 $b 是特殊的变量,能够使用 -1 进行索引等。

回想起来,我真的很喜欢我学习 Perl 的方式:通过玩 Perl Golf。

通过将一种语言使用到如此极端,你强迫自己找出它所有疯狂的部分,你真的需要理解不同的结构。特别是如果您与一群朋友/同事/...一起做这件事,这真的很好。

(当然这不应该是唯一的培训;)但我真的相信它在某些时候效果很好)

于 2011-02-27T12:56:33.317 回答