几乎每个编写的 perl 程序都使用这个习语:
{
open(my $fh, '>>', $filename) || die "you lose";
print $fh $blah;
}
但是,我不想死,我只想跳过打印。
所以我写:
{
print "you lose\n" unless (open(my $fh, '>>', $filename) and print $fh $blah);
}
并得到“不能在 ./o.pl 第 5 行使用未定义的值作为符号引用”来解决我的麻烦。
删除 my(错误形式)可消除此错误,如下所示:
{
my $fh;
print "you lose\n" unless (open($fh, '>>', $filename) and print $fh $blah);
}
但为什么?
为什么,在损坏的代码中,没有
$fh
存在于 open(my $fh...
到块的结束(}
)?
最佳答案
my
直到语句结束才生效。
出于同样的原因,my $x = $x
不会看到新的 $x
在声明的右侧。它会看到旧的 $x
.
例如
use strict;
use warnings;
my $x = 42;
{
my $x = $x + 1;
print "inside, x = $x\n";
}
print "outside, x = $x\n";
这打印:
inside, x = 43
outside, x = 42
您的
open
语句大致相当于内部my
上面的声明。如果您有 $fh
在外部作用域中声明,会发生令人惊讶的乐趣:您最终可能会打印到错误的文件。
关于perl - my 的词法范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20684010/