Heiko的Perl课程从周二到周五一共4天,本来打算每天学习完就把笔记整理出来,当然并没有成功😔。然后是周末,也悄无声息地过去了,笔记还是好好地躺在硬盘里没有动😐(仿佛听到鞭子抽在身上的噼啪声😷)。

讲师Heiko Schlittermann, 50岁左右,东德人,亲切,意料之外地geeky, 会开geek才能体会的玩笑😄。当然也像所有德国人一样,很严谨。一上来就让我们excuse他的口音,说英语里有些发音德语没有,德语母语的人就很难,比如”root”这个单词他就只能说到”woot”的程度😂。但其实他的英语表达是很准确的,可能说单口相声差点,做presentation是足够了。

课程很紧凑,每天早上会回顾前一天的内容。每讲完一个章节做练习,写脚本,然后答疑。说实话这4天的课程强度还是挺大的,如果不是因为我有Python基础,课程内容会很难消化。另外我也很佩服Heiko,顶着Jet lag给我们讲课,而且完全看不出疲态😓,越野跑选手是真的强👊。

整个Perl培训分为Perl Basic和Perl Advanced两个部分。在课程开始前需要准备Perl运行环境。Heiko用的系统是Debian,IDE用的是Vim。课程中的有些练习是需要Shell环境的,所以最好还是准备一个Linux环境,Windows用户可以用Windows Subsystem for Linux.

Perl观感
  • Perl哲学是尽可能多地提供选择,一个需求多种方式实现,放权给coder决定代码风格。
  • Perl的语法感觉像是从C语言到Python的过度
  • Perl很多操作感觉像是hack🤔
  • 在Python(和大多数其他语言)中,运算符重载让同一个运算符适应不同数据类型,执行相应的操作。例如,a + bab都是数值类型时执行数量加的操作,在ab都是字符串的时候执行字符串拼接操作。Perl没有运算符重载,但是相应地实现了“数据类型重载”,也就是说,同一对表达式(比如$a$b)所代表的数据会因为运算符的不同而改变。
Course overview

培训材料:Training Material Git Repo.

  • Perl Basic
    • First script
    • Documentation
    • Data structure - Scalar
    • Conditions
    • Data structure - List and Array
    • Subroutine
    • File and file handle
    • Hash / Dictionary
    • Regular Expression
  • Perl Advanced
    • I/O with subprocesses
    • References to data structures and subroutines
    • Package and namespace
    • OOP(object oriented programing) like programing
    • Typical directory structure for a module
    • Unit testing
    • Follow best practice

First Script

#! /usr/bin/perl
use strict;
use warnings;
print "Hello";
sleep 2;
print "World\n";
warn "You've been warned\n";
exit 27;

代码解释:

  1. #! /usr/bin/perl

    在Linux环境下,Perl脚本不需要以.pl结尾,因为Shebang(#!)已经告诉Linux系统用/usr/bin/perl来执行该文件。

  2. use strict

    The strict pragma disables certain Perl expressions that could behave unexpectedly or are difficult to debug, turning them into errors. The effect of this pragma is limited to the current file or scope block.

    strict关键字会禁用一些不规范、对Debug不友善的表达式,编译器在编译时会对这些表达式报错。它受作用域限制,作用范围是整个文件或者由{}包裹的代码块。

  3. use warnings

    这一行代码告诉Perl运行时在执行不规范代码的时候输出警告信息,如果不指定则输出到标准错误STDERR

  4. sleep 2

    表示延时2秒执行之后的代码。结果是脚本执行2秒后,输出了”HelloWorld”和换行符\n,但是按道理应该先输出”Hello”,隔2秒再输出”World\n”,这是什么原因呢?

    这是Perl标准输出的一个特性。”Hello”在输出到操作系统的STDOUT前会暂存在缓冲区(buffer)中,直到读取换行符\n才会flush buffer, 将Buffer中的”HelloWorld”和\n一起输出到STDOUT

  5. warn "You've been warned\n";

    这行代码会输出警告信息到系统STDERR;

    尝试在Shell中执行以下命令(其中”hello-world”是上面的脚本的名字):

    ./hello-world | cat -n

    Shell的Pipeline(|)会把脚本中print的内容暂存在系统STDOUTbuffer里,直到脚本执行完毕,才会把STDOUT中的内容作为输入传给cat -n。与此同时,warn语句生成的警告信息会输出到STDERR,而STDERR是不会缓存的,有警告信息就会输出。所以就出现了警告信息先出现,“HelloWorld”后出现。

  6. exit 27
    脚本指定返回值,在Shell中0代表脚本执行成功,任何其他数字表示脚本执行出现错误,具体数字及其含意由coder来决定。

Documentation

解决Perl问题最直接有效的方式就是查官方文档(也是解决大部分问题最有效的方式)。Perl文档集成在Linux系统内,也就是perldoc,通过CLI访问。

我没怎么深入研究,不过perldoc是支持正则查询的,所以只要正则用得好,查文档应该挺好用的?🤔

以下是CLI的打开方式:

  • For “pragmas” or “modules”: perldoc <pragma|module>

    perldoc warnings
    perldoc File::Basename
    perldoc -m File::Basename
  • For functions: perldoc -f <function>

  • For special variables: perldoc -v <variable>