见: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。
循环体执行完毕后,$_又重头开始匹配,陷入死循环。
没有评论:
发表评论