Three questions from Productivity501

Productivity501提出了三个问题,非常有趣,我在这里尝试回答一下。

问题一:你认为人们无意识地把时间浪费在什么地方?请举出你认为最浪费时间的一种行为?

回答:仅仅抱怨!我们也许无力改变所有事情,但至少可以改变一些事情;我们也许无力改变别人,但至少可以改变自己;我们也许无法让改变立即发生,但一天一点也可以聚沙成塔。当然抱怨也并非一无是处,适当发泄有利于心理健康,切忌滥用。

问题二:到目前为止,什么给你带来的变化最大?

回答:开源软件!如果没有开源软件,我不会喜欢上编程这行;如果不是开源软件,我不会为自己是个程序员而骄傲。开源世界就像一个大家庭,按需索取,力所能及地回馈。“在那一刻,他不是一个人在战斗,他不是一个人!”:-)

问题三:如果有人想只读一篇你的站点上的文章,你希望是哪一篇?为什么?

回答:Secure your job,一篇写于英特尔大裁员期间的感想。梦想!梦想?梦想……希望不仅仅是梦,也并非想想而已。

Extract quoted string with Regexp::Common

为了增强电子书搜索功能,我们引入两个元字符:和"。当我们想搜索一个词组(而不是单词)的时候,可以使用双引号将多个单词引起来,此时,双引号本身不作为搜索内容的一部分。当我们确实想搜索双引号时,需要写成",反斜杠取消了双引号的元字符功能。当我们想搜索本身时,就要写连续两个反斜杠。

对用户输入要分两步处理,首先,逐个取出引号引起来的部分,然后对剩下的部分分词。前一部分工作可以用Regexp::Common来完成:

my @quoted_string;
while ($search_string =~ s/$RE{delimited}{-delim=>q{"}}{-keep}//) {
    push @quoted_string, escape_special_char($3);
}

sub escape_special_char {
    my $string = shift;

    $string =~ s/\([\"])/$1/g;
    return $string;
}

其中$3是指被引号引起来的部分(不包含两边的引号),而escape_special_char将"替换为",将\替换为。完整源程序参见这里,版本号为1,其中还有警告双引号不匹配的功能。程序截图如下: