我真的不明白为什么以下的perl代码
#!/usr/bin/perl -w
use strict;
use warnings;
strange($_) for qw(a b c);
sub strange {
open FILE, '<', 'some_file.txt' or die;
while (<FILE>) { } # this is line 10
close FILE;
}
抛出以下错误
Modification of a read-only value attempted at ./bug.pl line 10.
这是一个错误吗?或者我应该知道魔术/隐式变量$_
的用法?
答案 0 :(得分:11)
while (<fh>)
构造隐式赋值给全局变量$_
。
当且仅当输入符号是唯一的内容时 以while语句(...)为条件,该值是自动的 分配给全局变量$ _,摧毁那里的任何东西 先前。 (...)$ _变量不是隐式本地化的。你会 必须放一个本地$ _;如果你希望这种情况发生在循环之前。
抛出错误是因为$_
最初被别名为常量值("a"
)。
您可以通过声明词法变量来避免这种情况:
while (my $line = <FILE>) {
# do something with $line
}
答案 1 :(得分:9)
是的,while循环读入$_
,此时该别名为常量(字符串“a”)。您应该在while循环之前使用local $_;
,或者读入单独的变量。