什么是对非 Perl 开发人员的有效 Perl 培训? [关闭]

Posted

技术标签:

【中文标题】什么是对非 Perl 开发人员的有效 Perl 培训? [关闭]【英文标题】:What constitutes effective Perl training for non-Perl developers? [closed] 【发布时间】:2010-09-13 14:06:17 【问题描述】:

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

我想到了一些事情:

印记的正确使用 引用/取消引用 ma​​p 等列表函数的使用, grep排序

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

【问题讨论】:

【参考方案1】:

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

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

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

祝你好运:)

【讨论】:

+1 O'Reilly Perl 系列。我发现风格和内容非常适合自学和参考。如果您将副本放在新学生的桌子上,钱就花得值了(并且避免了未来的悲痛)!【参考方案2】:

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

第一次浏览CPAN后的典型引用:

“你有 WHAT 的库吗?” “Extirpate html 必须是有史以来最好的函数名称!” "你可以在 Perl 中summarize 文本吗?"

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

然后你可以给他们看perldoc和Camel。

【讨论】:

我将自己归类为非 Perl 开发人员,必须学习 Perl 和 CPAN 确实是天赐之物。 +1【参考方案3】:

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

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

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

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

【讨论】:

我是 PTA 的 OO-Perl 和 Perl-DBI 课程的新近(一年前)“毕业生”,经过 13 年以上基于 92 版 Camel 的自学 perl .如果你在澳大利亚,我强烈推荐 PTA 的 4 天是($work 的)钱花得值。 # 嗨 P & J ;-)【参考方案4】:

我会首先告诉他们永远使用魔法咒语:

use strict;
use warnings;

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

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

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

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

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

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

我会简要地向他们展示 Perl 的“对角线”语法。像next unless /foo/ 这样的成语一旦使用就很棒,但在来自其他语言时显得非常陌生,尤其是“正交”语言。

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

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

【讨论】:

$_ 和 @_ +1,但没有其他标点符号。【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

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

在他们熟悉语言之后,Intermediate Perl 和 Advanced Perl Programming 可以让他们进一步了解 Perl 的世界

【讨论】:

【参考方案7】:

可能不完全符合您的要求。提前道歉。

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

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

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

只要我的两分钱。

【讨论】:

【参考方案8】:

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

【讨论】:

嗯,骆驼是一本不错的参考书,但是如果您可以先借一本 Llama 一周作为开始,那将是一个更简单的介绍(而且更幽默)。请注意,我没有说“购买”副本,因此不能指责我只是想要从销售中获得 1.50 美元。 真的,真的。我忘记了学习 Perl,因为从中学习了,骆驼成为了一个不变的伙伴。但它奠定了良好的基础。比我的第一本 Perl 书“Perl by Example”要好得多,我觉得它弊大于利。以后的版本可能会有所改进?【参考方案9】:

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

哦,为了补充 moritz 的想法,我就这一点对我的同事进行了辅导。

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

为什么不这样呢,看看 Damian 的 Perl Best Practices 并提出一些更强大的建议。

【讨论】:

【参考方案10】:

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

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

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

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

【讨论】:

这绝对是个问题,以至于我们实际上采用了“使用英语”的“最佳实践”,并避免使用更神秘的特殊变量名称。除了 $_。 :) 完全同意。直到你阅读了一个好的 Perl 教程,当你第一次遇到 $1、$_、$~ 和类似的东西时,你会因为不知道它们在哪里定义,也不知道它们做了什么而生气。 下一个 if /^#/; # 跳过注释行 我从不跟踪他们。我只是读了很多 perlvar。 :)【参考方案11】:

我会选择各种引用运算符(来自 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 所具有的各种引号。

【讨论】:

【参考方案12】:

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

for (my $i = 0; $i < @a; $i++)

  &do_something_with($array[$i]);

用这个成语:

foreach my $a (@array)

  &do_something_with($a);

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

【讨论】:

不要在正常的子程序调用中使用 & 符号。这已经过时多年了。 更好的是 "for (@array)do_something_with($_)" 甚至是 "map do_something_with @array"。 @Jon:仍然不鼓励在 void 上下文中使用 map,即使它不再浪费。编写示例的惯用方式是“do_something_with($_) foreach @array” @Michael:说得好。 (我希望代码在 cmets 中看起来和在帖子中一样好。) 我知道 & 已经过时了。我只是用它来让我写的东西变得明显。【参考方案13】:

开个玩笑,但无论你做什么,都显示thisLAST 之类的东西! ;)

use integer;@A=split//,<>;sub Rfor$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=>10..80;R($A[
$i]=$_)for grep!$t$_1..9;return$A[$i]=0die@AR

【讨论】:

但是,嘿,它解决了数独问题;)【参考方案14】:

正如其他人所说:

use strict;
use warnings;

也许

use diagnostics;

Java 程序员:

use autodie; #or Fatal

英文.pm 驼鹿/老鼠 Perl::Critic 无私的

【讨论】:

【参考方案15】:

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

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

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

【讨论】:

"告诉我不能使用 CPAN" 为什么理智的人仍然这么说?哦,我忘记了。这可能是一个尖头发的老板。【参考方案16】:

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

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

【讨论】:

【参考方案17】:

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

【讨论】:

【参考方案18】:

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

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

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

第 2 点:在 Perl 中,您可以随心所欲地弥补。在其他作品中,您可以说 “在哈希 'w' 中,键 'x' 索引一个匿名数组,其中框 'y' 包含 'z'” 并且解释器将为随你去。

【讨论】:

【参考方案19】:

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

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

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

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

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

【讨论】:

以上是关于什么是对非 Perl 开发人员的有效 Perl 培训? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Perl 开发人员修复 DBD-MySQL 关键漏洞

Perl 6 Deep Dive

Perl单行(Perl One-Liners)命令

全球仅10%开发者从不加班,Perl收入最高| Stack Overflow年度报告

使用 Perl 检查数据数组中重复项的最有效方法是啥?

LAMP中的“P”有啥意义?为啥是 PHP、Perl 或 Python?