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

时间:2020-03-06 14:48:19  来源:igfitidea点击:

我与Perl合作已经足够长的时间了,以至于它的许多特质已经成为我的第二天性。当新的程序员加入我们的团队时,他们通常很少或者几乎没有Perl的经验,而这通常是我的任务(在必要的程度上)。我想知道培训Perl新手但有其他语言经验的程序员时应侧重于什么(这个问题本意是与语言无关的,但是我与之合作的大多数开发人员都来自Java)。

我发生了一些事情:

  • 正确使用签名
  • 引用/解引用
  • 使用列表函数,例如map,grep,sort

在帮助程序员过渡到Perl时,我们有什么特别需要关注的重点吗?我们是否强调相似性或者差异性,或者两者均等?

解决方案

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

并且,当然,使用正则表达式。

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

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

可能不完全是我们要找的东西。提前致歉。

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

我从Perl(和我的Perl导师)那里学到的最重要的一课是"有不止一种方法可以做到这一点"。因此,我认为学习Perl的最好方法是拥抱其对编程的态度,并在每位程序员找到自己的方式时给予支持。

我们正在制作的示例,列出函数等都是使用时自然产生的东西-只有获得Perl的"事物之道",我们才能理解它们的功能。

只是我的两分钱。

我会选择各种报价运算符(来自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的各种引号,因此在阅读代码时也有帮助。

我们可以向他们展示的最重要的内容是如何访问文档以及如何查找文档(perldoc perltocperldoc -q $ keyword,perldoc -f $ function等)。

Perl附带了出色的文档,包括参考资料和教程风格的资料。使新手可以访问它是我们可以为他们做的最有效的事情。

对于C ++ / Java / Ccoders,我要特别强调的两个区别是:

No 1:在Perl中,几乎所有东西都有含义,但并非总是我们想要的。很好的例子包括:

  • 没有信号的变量名不会停止执行-它们被解释为裸字
  • 尝试将数组存储在标量中,然后得到长度
  • 尝试将散列存储在标量中,我们会得到" a / b"(正在使用的存储桶还是总存储桶?)

No 2:在Perl中,我们可以随时进行弥补。在其他作品中,我们可以说"在散列'w'中,键'x'索引一个匿名数组,其中框'y'容纳'z'",并且解释器将为我们创建和调整所有变量的大小。

我认为Perl的"杀手级应用"是CPAN

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

"You have a library for WHAT?"

  "Extirpate HTML has to be the best function name ever!"

  "You can summarize text in Perl?"

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

然后,我们可以向他们展示perldoc和Camel。

这只是一个细节,而不是我们问题的完整答案,但是对我来说,真正面向Perl的人的标记是代替了这个惯用法:

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

这个成语:

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

以列表的形式教他们列表,而不仅仅是数组。教给我们很棒的数据结构。教导列表,哈希,哈希列表,列表哈希,哈希哈希。那是最强大的提升能力,超过了大多数传统的强类型语言。 (具有讽刺意味的是,在我今年加入的Java商店中,我们随处可见数以吨计的任意深度嵌套的HashMap结构。实际上,太多了;我是一个主张少做一点的人!但是在Perl中,这种事情至关重要。)

我将从告诉他们始终使用神奇的咒语开始:

use strict;
use warnings;

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

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

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

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

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

将它们引入正则表达式,并使它们习惯于正则表达式是Perl中的一流对象。

我将向他们简要介绍Perl的"对角线"语法。除非有/ foo /`这样的惯用语,一旦我们使用它们就很好了,但是当来自其他语言(尤其是"正交"语言)时,看起来非常陌生。

我们无需立即谈论引用。让那等到他们准备做需要数据结构的事情。诸如map和grep之类的功能也可以等待。

在基础上打下坚实的基础。让他们先走一会儿,然后再结合使用更高级的功能和习惯用法。

坦白说,我只给他们骆驼。这是一本具有可读性和娱乐性的书,它们将立即启动并运行。我仍然在笑" Perl坚持不言而喻的真理",距离我第一次阅读它已经十年了。

只是在开玩笑,但无论我们做什么,都要显示最后这样的内容! ;)

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

另一个令人惊讶的方面是上下文。函数或者什至变量的行为取决于在列表或者标量(或者空)上下文中引用它们的行为不同,这一事实已成为Perl受训人员的重要细节。

我通常坚持使用内置功能(" map"," grep"," splice"," split")进行"高级"处理。由于TMTOWTDI,许多程序员只记得Perl较为熟悉的方面(例如C风格的循环,substr和index),而仅使用这些方面。

在他们熟悉该语言之后,中级Perl和高级Perl编程可以使他们对Perl的世界有更深入的了解。

检查一下我书的目录。学习Perl和中级Perl均旨在教程序员Perl语言。我们涵盖了大多数人一直使用的80%的Perl,并通过对Perl进行多年教学而得到了发展。每本书都是作为教程设计的,每章的末尾都有练习。我还写了《 Learning Perl学生工作手册》以提供其他练习。对Perl编程也是一个很好的参考。

实际上,"获取" Perl所需了解的规则很少,而且大多数人仅通过查看代码就无法正确理解这些规则。教一些来自另一种语言的新Perlers的一些知识:

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

祝你好运 :)

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

哦,除了增加moritz的想法外,我还为此教了我的同事。

另外,我还提供了一些有关Data :: Dumper,Scalar :: Util,List :: Util的指令以及类似的一些非常有用的模块。

而且为什么不这样做,请查看Damian的Perl最佳实践,并抓住一些更强有力的建议。

我拥有和管理Perl Training Australia。我教Perl已有八年了,计算机科学教了十多年。我不仅对Perl,而且对教学和总体介绍都有很强的见解。我已经写了数百页有关Perl的文字-在这里我将不再重复-所以我要给你的不是关于教授Perl的建议;而是元建议。

首先,如果时间和预算允许,请考虑派遣员工参加专业的Perl培训课程。专用课程的优势在于它们不会伴随工作中断,也不会伴随职场政治,并且确实会陪伴那些非常熟悉人们在学习Perl时所遇到的困难的人。请确保我们有一位了解他们的知识并且是Perl社区的活跃成员的培训师;这意味着他们应该能够回答向他们提出的任何问题,或者将提问者定向到可以了解更多信息的适当参考资料中。是的,我经营Perl培训业务,因此在这里我很自以为是。

如果出于某种原因我们不能参加专门的课程,那么可以买一本专门设计用来教人们如何在Perl中进行编程的书,并逐步进行学习。很容易错过事情,或者尝试以错误的顺序介绍事物,或者(天禁地)教坏习惯,所有这些都会使生活变得困难。通常,编写用于教授Perl的书籍的人都是拥有成功的Perl培训业务的人。如果我们想购买一本书,我建议我们使用最新版本的Learning Perl。如果我们想下载一本书,我建议我们从Perl Training Australia网站上获取《编程Perl》课程笔记。

这两本书都附有练习,这将我带到了我的最后一个元建议中。确保正在学习Perl的任何人都可以进行练习。学习任何新技能以认为自己知道正在发生的事情非常容易,但是发现将其付诸实践比想象中的要难。对于Perl尤其如此,其中可以应用诸如"上下文"之类的编程概念,这在其他语言中很少见。通常,这些练习是专门设计用于教授某种技能或者强调某些陷阱的;与在项目截止日期前夕将它们弄清楚相比,在学习过程中弄清楚这些事情要容易得多。

正如其他人所说:

use strict;
use warnings;

可能是

use diagnostics;

对于Java程序员:

use autodie; #or Fatal

英语.pm
驼鹿/老鼠
Perl :: Critic
lt昧

我只是被录用到这个确切的场景中。我是C ++和Java开发人员,直到我目前的工作之前从未接触过Perl。也需要花费一些时间来使用的东西是特有的Perl语法选择[$ _],$ this = that,除非...以及看到树木的森林(任何包含/ ^#+ \ d /元素的东西)。其他事情只是我在[混淆OO语句,$ self和放入1;在模块文件末尾]。

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

话虽如此,我得到了大约35,000行的代码库,这本骆驼书告诉我不能使用CPAN。已经有六个月的成果了。 ^^

对Perl进行编程(由#22483出色的Randal共同撰写,我已经有10年的经验了)对Perl来说是一个很好的介绍。从正则表达式,切片和切分数组,关联数组等开始。再加上在Perl中进行报表的原因和方式以及功能参考。

我不确定在第三版中它有多少变化,但是我会在此基础上学习并将其用作教科书。这很简洁,而且要讲到重点。另外,课程与文档匹配。

根据我在工作场所的经验,我建议我们从Perl的文档开始(已经在此处进行了介绍),并花一些时间向学生展示如何在命令行上测试代码。令人惊讶的是,有人可以快速尝试某种语言并进行更正,直到正确为止,他们才能很快学会一种语言。