什么构成非Perl开发人员的有效Perl培训?

时间:2008-09-26 20:06:34

标签: perl cpan timtowtdi

我已经和Perl合作了很长时间,以至于它的许多特质已成为我的第二天性。当新程序员加入我们的小组时,他们经常对Perl几乎没有经验,而且通常我的任务是训练它们(在必要的程度上)。我想知道在培训一个刚接触Perl但具有其他语言经验的程序员时应该关注什么(这个问题与语言无关,但我与之合作的大多数开发人员都来自Java)。

我发生了一些事情:

  • 正确使用sigils
  • 引用/解引用
  • 使用地图等列表功能, grep 排序

在帮助程序员过渡到Perl时,您是否发现有必要专注于它?你是否同等地强调相似性或差异,或两者兼而有之?

19 个答案:

答案 0 :(得分:20)

查看我的图书的目录。 Learning PerlIntermediate Perl都旨在向程序员传授Perl语言。我们覆盖了大多数人一直使用的Perl的80%,并开发了多年来教授Perl的人。每本书都是作为教程设计的,每章末尾都有练习。我还写了Learning Perl Student Workbook来提供额外的练习。 Programming Perl也是一个很好的参考。

实际上很少有人需要知道“获取”Perl的规则,大多数人只是通过查看代码就不能正确地遵守这些规则。有些东西要教新来自另一种语言的Perlers:

  • 严格和警告
  • 标量与列表上下文
  • 动态范围与词汇范围
  • sigil不是变量类型
  • 列表创建和操作(map,grep,sort)
  • 如何有效地使用CPAN
  • 闭包和子程序作为数据
  • Perl中的递归很糟糕
祝你好运:)

答案 1 :(得分:14)

我认为Perl的“杀手级应用”是CPAN ...

首次浏览CPAN后的典型报价:

  

“你有WHAT的图书馆?”   “Extirpate HTML必须是有史以来最好的功能名称!”   “你可以在Perl中使用 summarize 文本吗?”

一旦程序员看到做硬件有多容易,就会被卖掉。

然后,您可以向他们展示perldocCamel

答案 2 :(得分:11)

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

首先,如果您的时间和预算允许,请考虑派遣您的员工参加专业的Perl培训课程。专用课程的优势在于,它们不会带来工作中断,也不会带来工作场所政治,而且他们的人会非常熟悉人们在学习Perl时遇到的困难。请确保您有一位知道他们的东西并且是Perl社区活跃成员的培训师;这意味着他们应该能够回答任何问题,或者将提问者引导到适当的参考,以便他们可以了解更多信息。是的,我经营一个Perl培训公司,所以我在这里非常自以为是。

如果由于某种原因你无法选择专门的课程,那么请购买一本专门用于教人们如何在Perl中编程的书,并逐步完成。很容易错过任何事情,或者尝试以错误的顺序介绍事物,或者(天堂禁止)教导不良习惯,所有这些都会让你的生活变得困难。编写专门用于教授Perl的书籍的人通常与成功进行Perl培训的人员相同。如果您想购买一本书,我会推荐最新版本的 Learning Perl 。如果你想下载一本书,我建议你从Perl Training Australia website获取 Programming Perl 课程笔记。

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

答案 3 :(得分:8)

我首先要告诉他们要始终使用神奇的口头禅:

use strict;
use warnings;

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

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

我会谈论标量与列表背景。

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

介绍$_@_。理解$_至关重要,因为它在很多地方使用,通常是隐含的。 @_对于编写子程序至关重要。其他标点符号变量的使用频率较低,可以等待。

将它们引入正则表达式,让它们习惯于将正则表达式作为Perl中的第一类对象。

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

您无需立即谈论参考资料。让它等到他们准备好做需要数据结构的事情。像mapgrep这样的功能也可以等待。

为基础建立坚实的基础。让他们采取婴儿步骤一段时间,然后混合更高级的功能和习语。

答案 4 :(得分:7)

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

Perl附带了很棒的文档,包括参考和教程风格的材料。让新手可以访问是最有效的事情。

答案 5 :(得分:7)

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

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

在熟悉该语言后,Intermediate PerlAdvanced Perl Programming可以让他们进一步深入了解Perl世界

答案 6 :(得分:6)

可能不完全是你想要的。提前道歉。

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

我从Perl(和我的Perl导师)那里学到的最重要的一课是“有多种方法可以做到”。因此,我认为学习Perl的最佳方式是接受对编程的态度,并支持每个程序员,无论他们如何找到自己的方式。

您正在制作的示例,列出函数等,这些都是使用中自然而然的事情 - 只有获得Perl“事物的方式”后才能理解它们的力量。

只是我的两分钱。

答案 7 :(得分:6)

坦率地说,我只是给他们骆驼。它是一本如此易读且有趣的书,它们将立即启动并运行。我仍然在笑'Perl认为真理是不言而喻的',而且自从我第一次读它以来,它必须是十年。

答案 8 :(得分:4)

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

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

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

next unless "$_" !~ /^#/;

答案 9 :(得分:4)

我只能补充一点,那些来自表达力较弱的语言的人可能不会理解哈希表达式或散列和数组切片表达式。好像现在每种语言都有PCRE库。

哦,为了补充莫里茨的想法,我就这样辅导了我的同事。

另外,我在Data :: Dumper,Scalar :: Util,List :: Util和一些非常有用的模块中包含了一些指令。

为什么不这样做,请查看达米安的Perl Best Practices并提出一些更有力的建议。

答案 10 :(得分: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所具有的各种引号。

答案 11 :(得分:2)

开玩笑,但无论你做什么,最后都会显示this之类的东西! ;)

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

答案 12 :(得分:2)

其他人说:

use strict;
use warnings;

也许

use diagnostics;

对于Java程序员:

use autodie; #or Fatal

English.pm
穆斯/鼠标
Perl的::评论家
perltidy

答案 13 :(得分: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,这种事情至关重要。)

答案 14 :(得分:1)

我刚被雇用到这个确切的场景中。我是一名C ++和Java开发人员,在我目前的工作之前从未接触过Perl。花费一些时间来使用的东西也是特殊的Perl语法选择[$ _],$ this =除非......,并且看到树的森林(任何包含/ ^#+ \ d /元素的东西)。其他的事情只是我在编程室工作的结果[令人困惑的OO语句,$ self和put 1;在模块文件的末尾]。

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

所有这一切,我被交给了大约35,000行的代码库,这本骆驼书告诉我不能使用CPAN。这是一个富有成效的六个月。 ^^

答案 15 :(得分:1)

Programming Perl(由#22483合着 - 良好的工作兰德尔,我已经接近10年了)是Perl的一个很好的介绍。从正则表达式,切片和切块数组,关联数组等开始。再加上Perl中的报告和函数引用。

我不确定它的第三版有多少变化,但我会根据它开设一门课程并将其作为课本使用。这是合理的简洁和重点。另外,您的课程与您的文档相符。

答案 16 :(得分:1)

根据我在工作场所的经验,我建议从Perl的文档开始(这里已经介绍过)并花一些时间向学生展示如何在命令行上测试代码。令人惊讶的是,当他们可以动态尝试某些东西并进行修正直到他们做对了,有多快能找到语言。

答案 17 :(得分:0)

对于C ++ / Java / C#编码器,我强烈反对的两个不同之处是:

否1:在Perl中,几乎所有东西都有意义,但并不总是你想要的。好的例子包括:

  • 没有符号的变量名称不会停止执行 - 它们被解释为裸词
  • 尝试将数组存储在标量中并获得长度
  • 尝试在标量中存储哈希,你得到'a / b'(使用桶和总桶?)

No 2:在Perl中你可以随着时间的推移弥补它。在其他作品中,您可以说“在散列'w'中,键'x'索引一个匿名数组,其中'y'包含'z'”,解释器将创建并调整所有变量的大小你去吧。

答案 18 :(得分:0)

确定。当然你需要在某些时候使用严格。确定你想在某些时候使用库。但严格只是Perl的基本启动文件,每种语言都有库。我不认为这些是开始时学习非常重要的事情。

当你从Perl开始,但已经知道其他语言时,你需要知道疯狂的特性,例如$ a和$ b是特殊的变量,能够使用-1等进行索引。

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

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

(当然这不应该是唯一的训练;)但我相信它在某些方面效果很好)