说起来,不要求精通,我学过的编程语言已经挺多的了。我曾看过Python的规矩整齐,看过Haskell 的玄奥巧妙,看过Ruby的小家碧玉,看过php的简单粗暴,看过Go的倒行逆施,看过Swift的婀娜多态,看过 Scala的内涵丰富,看过Lisp的重剑无锋,然而,沉舟侧畔千帆尽,回过头来才发现perl才是真正的火星文。

最近在用perl处理很大的文本,在写脚本的过程中踩了不少坑,所以我把它们都记录下来,作为自己的火星文 学习笔记。

单引号和双引号

最开始使用perl的时候,是没有注意到perl是区分单双引号的,就按自己写python的习惯用了。但是,在perl 中,单引号引起来的就是字符串,而双引号则会对变量和转义符进行解释。比如:

$string = '\t';                          # two characters, \ and an n
$string = 'Jon \'Maddog\' Orwant';       # literal double quotes

在单引号的字符串中,'表示字符串的终结,\'表示字符串,’\‘表示反斜杠。在双引号里有:

$string = "\n";                          # a "newline" character
$string = "Jon \"Maddog\" Orwant";       # literal double quotes

神奇的while(<>)

第一次看到形如while(<>)的代码的时候我是一脸懵逼的,后来我才知道他的意思是对输入的每一行进行 遍历,每一行的内容默认为变量$_。这里才是Perl真正体现火星文的一部分。

恶心的Hash

在Perl中怎样定义一个Hash呢?

%hash = ();       # define an empty hash
%hash = (
	"A" => 1,
	"B" => 2,
	"C" => 3
);

那怎样定义一个二维hash呢?

%hash = (
	"A" => {
		"a" => 1,
		"b" => 2
	},
	"B" => {
		"c" => 3
	}
);

实际上,大括号{}相当于构建了一个hash的引用。在这个二维hash里,每一个第一维的key对应的value都是一个hash的引用,这个引用构成了第二维的hash。所以在遍历二维hash的时候应该这样写:

while (($key1, $hash2) = each %hash) {
	foreach $key2 (keys %{$hash}) {
		# Your code here
	}
}