为什么变量不可用? [已关闭]

问题描述 投票:0回答:2

在下面的代码块中我收到此错误

Variable "$host" is not available at /comp/xx.pm line 404.

其中第 404 行是代码块中的最后一行。

问题

我猜测是

Capture
模块搞乱了
if (defined $host) { ...
,但我该如何解决这个问题?

use Capture::Tiny 'capture';

my $host = $::c{slaves}{$id} if (defined $id);

my ($stdout, $stderr, $exit) = capture {
    if (defined $host) {
        print "---delete $snap on host\n";
    } else {
        print "----delete $snap on master\n";
    }
}; # line 404

更新

如果我注释行

capture
及其右括号,那么它将执行预期的
print
行。

perl
2个回答
7
投票

问题出在这一行:

my $host = $::c{slaves}{$id} if (defined $id);

Perl 目前不支持使用

my $x = value if condition
。它有点有效,但有奇怪的极端情况。这是一个。

将赋值与变量声明分开:

my $host;
$host = $::c{slaves}{$id} if (defined $id);

您可以在相关警告的文档中阅读更多详细信息。


5
投票

参见 perldiag 了解解释:

Variable "%s" is not available (W closure)

在编译期间,内部命名子例程或 eval 试图捕获不存在的外部词法。 目前可用。发生这种情况可能有两个原因之一。首先,外部词法可以在外部声明中声明。 尚未创建的匿名子例程。 (请记住,命名子程序是在编译时创建的,而匿名子程序是在编译时创建的) 在运行时创建。)例如,

           sub { my $a; sub f { $a } }

创建 f 时,它无法捕获 $a 的当前值,因为匿名子例程尚未创建 然而。相反,由于匿名子例程现已创建并处于活动状态,因此以下内容不会发出警告:

           sub { my $a; eval 'sub f { $a }' }->();

第二种情况是由eval访问超出范围的变量引起的,例如,

           sub f {
               my $a;
               sub { eval '$a' }
           }
           f()->();

这里,当编译 eval 中的 '$a' 时,f() 当前并未执行,因此它的 $a 无法捕获。

© www.soinside.com 2019 - 2024. All rights reserved.