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