2

在这种情况下,有没有办法在不使用符号链接的情况下知道变量的名称?

use strict;
...
for ($var1, $var2, $var3)
{
   die "NAME_OF_VAR is not defined" if !defined $_;
}

未定义 var 时的输出:

“var[123] 未定义在 ...”

4

5 回答 5

2
use strict;
use warnings;

my ($var1, $var2, $var3) = 1..2;
for( qw($var1 $var2 $var3) ) { print "$_ is undefined\n" if !defined eval($_) }

my行从 TLP 的示例中借用,并具有以下输出:

$var3 is undefined
于 2012-05-06T02:38:47.347 回答
2

PadWalker是解开别名的答案。然而,几乎在任何以 PadWalker 为答案的情况下,它都可能是错误问题的答案。它是用于调试或在将自己画到角落后寻找出路的那些模块之一。如果它被用作糟糕设计的出口,也许重新考虑设计是一个更好的选择。在您的情况下,答案可能是已经提到的答案:将警告提升为失败。

尽管如此,该模块仍然存在,可以工作并且玩起来很有趣。

由于该问题专门询问了有关解开或检查别名的问题,因此这里有两个示例,其中 PadWalker 能够将别名切回原始变量:

use strict;
use warnings;


use PadWalker qw( var_name );


my( $var1, $var2, $var3 ) = ( undef, undef, undef );


for ($var1, $var2, $var3) {
    warn var_name( 0, \$_ ) . ' is not defined in "for" loop'
        if !defined $_;
}


sub foo {
    warn var_name( 1, \$_[0] ) . ' is not defined in sub foo()'
        if !defined $_[0];
}

foo( $var1 );

产生的输出将是这样的:

$var1 is not defined in "for" loop at mytest.pl line 13.
$var2 is not defined in "for" loop at mytest.pl line 13.
$var3 is not defined in "for" loop at mytest.pl line 13.
$var1 is not defined in sub foo() at mytest.pl line 19.

var_name( 0, ...注意在循环内部如何指定是必要的for,而在子例程内部我们需要使用varname( 1, ....

也可能令人感兴趣的是given/when语句不使用别名,尽管它们看起来这样做。因此,PadWalker 无法回溯到given(...).

于 2012-05-06T17:23:52.997 回答
2

这是获取未定义变量的致命警告的一种方法:

my ($var1, $var2, $var3) = 1..2;

{
    use warnings FATAL => 'all';
    my $test = "$var1 $var2 $var3";
}

输出:

当上面的块中发生错误时,脚本会终止。在这种情况下:

Use of uninitialized value $var3 in concatenation (.) or string at ...

我选择串联作为定义性测试,但它可能是在使用未定义变量时导致警告的任何操作。

于 2012-05-06T01:47:42.937 回答
0

考虑 PadWalker 模块:

#!/usr/bin/env perl
use warnings;
use strict;

use PadWalker qw(var_name);

my $foo = 123;
print var_name(0, \$foo), "\n"; # prints "$foo"

默认情况下不安装 PadWalker,因此您需要使用系统上的 cpan 命令行工具安装它。

当然,PadWalker 很疯狂,可能不是做任何你想做的事情的最佳方式,但偶尔玩一玩肯定很有趣。

于 2012-05-06T16:01:31.780 回答
0

我想你已经说过了,你需要象征性的参考。请记住,这些不是邪恶的,它们通常不是你想要的。在这种特定情况下,您正在执行一种元编程,您关心变量的名称。因此,您可以这样做。

use strict;
...
for (qw/var1 var2 var3/)
{
   no strict 'refs';
   die "$_ is not defined" if !defined ${$_};
}
于 2012-05-06T14:18:14.700 回答