清纯自然

2010/09/04

“小驼书”精彩语录(四)

Filed under: Perl — billzt @ 11:48 上午

月如:
——当Larry考虑Perl要提供哪些操作符时,他不想让老的C程序员有机会怀念那些C有而Perl没有的东西。所以他把C所有的操作符都搬过来了(严格说来,他其实舍弃了在Perl中无用的操作符,例如将数字转换为内存地址的操作符。当然他还加上了几个让C程序员嫉妒的操作符,比如字符串连接)。这个决定导致Perl拥有了C语言最让人困惑的操作符,也就是三目?:操作符。

——如果你不知道文件名和目录名可以包含换行符的话,那就说明你不完全了解这些规则,对吧?

——许多古老的Unix程序都犯了这个错误,以为 . 和 .. 一定是前两个返回的条目(无论是否排序)。如果你根本没这么想过,请忘记这段脚注,因为这是错误的猜想。事实上,我们现在已经后悔提到它了。

——Perl的初学者在测试unlink时,常会在建立一个文件后将它chmod成0(这样就无法对它进行读写),看看这是否能导致unlink执行失败,可是结果恰好相反,文件却像肥皂泡一样消失了。

——有些人知道rm在删除这种文件时通常会提醒用户确认。不过rm是个命令,而unlink则是系统调用。系统调用不需要确认,也从来不说抱歉。

——如果你真的想看到unlink操作失败,只要试着删除/etc/passwd或类似的系统文件就行了。因为这个文件是由系统管理员控制的,因此你无法将它删除(当然,如果你在尝试这种操作时太粗心,忘了现在正在以系统管理员的身份登录,那是罪有应得)。

——乍听到排序子程序这个术语时,如果你上过计算机科学的课,脑海中可能会浮现出冒泡排序、希尔排序和快速排序。然后你会说:“拜托,别再谈这些了!”请放心,事情没那么复杂,其实还相当简单。Perl其实知道怎么对列表排序,它只是不知道要用什么样的规则。所以排序子程序只是用来说明具体的规则。

——在处理更复杂的情况时,智能匹配操作符才会大显身手。比方说,你想在哈希%names中查找任何匹配Fred的键,如果找到就打印一条消息出来。你无法用exists判定。因为它需要给定确定的键。当然,你可以用foreach来遍历每个键,尝试用正则表达式匹配,跳过那些不匹配的,直到发现要找的键,保存到标记变量$flag中,然后用last跳出循环:

my $flag=0;

foreach my $key (keys %names) {
    next unless $key =~ /Fred/;
    $flag = $key;
    last;
    }
print “I found a key matching ‘Fred’.It was $flag\n” if $flag;

唷!这么麻烦,连解释起来都费力,不过这么写也有好处,那就是各种Perl 5 版本都支持。可有了智能匹配操作符,只要把哈希写在左侧,把正则表达式写在右侧,就搞定了。

use 5.010
say “I found a key matching ‘Fred'” if %names ~~ /Fred/;

——反引号写法要模拟单引号很麻烦,因为变量内插和反斜线转义总是会起效。(所以若要向shell发送反斜线符号,就得连写两个反斜线。因为在windows环境中常需要两个连续的反斜线,就要连写4个。

——哈希切片是一个切片而非哈希,如同炉火是指火而非炉,而火炉是指炉而非火。

(完)

在WordPress.com的博客.