2009年10月31日星期六

Perl Medic : /g 匹配的问题

见:Perl Medic - 6.2.3 Superfluous Use of scalar()

while ( /(\w+)\s+(\d+)/g) { ... }  # while是标量环境
                                   # 匹配 $1,$2,执行循环体
                                   # 接着匹配下一对 $1,$2

foreach (/(\w+)\s+(\d+)/g) { ... } # foreach是列表环境
                                   # 直接把所有匹配的$1,$2扔到一个array中,相当于
                                   # my @array = /(\w+)\s+(\d+)/g;
                                   # foreach(@array){ ... }

所以下面这么写是错的:

while (my ($fruit, $count) = /(\w+)\s+(\d+)/g) #Wrong!
{
  $stock{$fruit} = $count;
}

原因是 my ($fruit, $count) 代表了列表环境,$_会直接匹配到底。

最前一对匹配的$1,$2抽出来赋值给$fruit,$count。

循环体执行完毕后,$_又重头开始匹配,陷入死循环。

没有评论:

发表评论