真正的火星文——Perl
说起来,不要求精通,我学过的编程语言已经挺多的了。我曾看过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
}
}
Comments