perl - my 的词法范围

标签 perl

几乎每个编写的 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/

相关文章:

regex - 获取所有 perl 正则表达式捕获组的值

MySQL查询2表,1插入

perl - 当我访问 twitter 时 OAuth::Lite::Consumer 超时

perl - 在 Perl + EOF 处理中将位写入(和读取)二进制文件

perl - 在 Perl 中从括号中获取键值对

perl - 通过 perl Mechanize 获取有关文件附件的信息

perl - 在 Perl 中枚举所有可能长度的有序标记

mysql - 当我使用 perl 将 infile 加载到 mysql 数据库中时,为什么返回的计数不正确?

regex - 使用 perl 将 XML 转换为 JSON

perl - 使用 proc::Daemon 模块将脚本作为守护进程运行