Translated from: http://www.xaprb.com/blog/2006/10/05/five-great-perl-programming-techniques-to-make-your-life-fun-again/
如果你是一个程序员,你就知道新手和老手之间的就是,老手可以轻易写出简洁且很有用的代码。如果你能做到这点,你就可以轻松地提高你的效率和你的代码质量一个数量级。更重要的是,在编码过程中,你获得了很多乐趣。继续阅读,看看如何做到吧。
设想一下吧,用你程序代码的十分之一写个程序,但具有多十倍的功能、更少的bug、更好的性能以及更低的维护成本;这让你从单调重复的劳动中解脱出来,将更多的时间留给你的灵感和洞察。我在我的职业生涯中已在多种语言中做得了这一点,并且随着每学一门新语言,我的效率会更高。
我准备使用Perl来展示达成这个目标的一些技巧。Perl既是我的第一个语言,也是我最近才精通的语言。我想Perl有助于本文的探讨。
技巧 1: map 和 grep
内置的map函数是你的工具箱里最有用的工具之一。map接受一个列表并将一个代码块应用于其每个元素,并返回结果列表。其实你可以把它当作一个流处理:你将一个列表从一端push进去,中间经过处理后,再从另一端取回来。代码块中,使用传统的$_变量代表当前处理的元素。下面是个简单的例子:将列表的每个元素变成大写。
my @lamps = qw(perl php python);
my @uc_lamps = map { uc($_) } @lamps;
# Result: PERL PHP PYTHON
上面的代码中,我将一个列表从右边推进去,它从右向左穿过,最后从左边冒出来,然后赋值给@uc_lamps。事实上,当map用于列表的变换时它几乎有无穷的牛力!它其实只是一个美化的循环,但如果你把它看作是输入到输出的转换时,你可以用它写出很优美的代码。下面是另一个例子——将分割的字符串变成由键-值组成的哈希:
my $input = "a:1,b:2,d:3";
my %output = map { split(/:/, $_) } split(/,/, $input);
弄明白它是怎么回事了吗?和前面一样,我们先从右边开始。split函数将输入的字符串用逗号,切分开,并输出一个列表。输出的这个列表再进入map区块,其每个元素被map切分成哈希的键和值,这些最后都赋值给哈希了。这比用循环来写容易多了,并且一旦你用熟了,这也更易于阅读。
It’s also unsafe code. Here’s why: it doesn’t check for an odd number of elements in the resulting list, which could happen with input that’s not delimited as expected, like this:
这段代码也是不安全的,因为它不检查产生的列表元素的数目的奇偶性,譬如当输入的字符串并不是按预期来分割的时候,就像这样:
my $input = "a1,b:2,d:3,e:f:g";
my %output = map { split(/:/, $_) } split(/,/, $input);
用奇数个元素给哈希赋值会打破键值之间的联系。你可以通过声明“use warnings FATAL => ‘all’”来捕获之,但是修复它比抛出错误要更好一些。这是另一个基于列表的构造——grep——显身手的时候了,它接受右边进入的列表并输出符合某些条件的元素。下面我们增加一个可切分性的检查,再将其只切分成两个元素,最后重排一下代码更便于阅读:
my $input = "a1,b:2,d:3";
my %output =
map { split(/:/, $_, 2) }
grep { m/:/ }
split(/,/, $input);
好了,现在只有那些有效的元素才会进入哈希了。
技巧2:用||=实现缺省值
to be continued……
发表看法