有没有办法在不使用符号链接的情况下知道变量名称?在Perl中:有没有办法知道列表中变量的名称?
use strict;
...
for ($var1, $var2, $var3)
{
die "NAME_OF_VAR is not defined" if !defined $_;
}
如果变量没有定义输出:
“变种[123]未在规定......”
有没有办法在不使用符号链接的情况下知道变量名称?在Perl中:有没有办法知道列表中变量的名称?
use strict;
...
for ($var1, $var2, $var3)
{
die "NAME_OF_VAR is not defined" if !defined $_;
}
如果变量没有定义输出:
“变种[123]未在规定......”
这里得到一个未定义的变量的致命警告的一种方式:
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 ...
我选择了级联作为definedness的测试,但它可能是导致警告当使用不确定的变量进行任何操作。
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
我觉得你自己已经说了,你需要象征性的裁判。请记住,这些不是邪恶的,他们只是不是通常你想要的。在这个特定的情况下,你正在做一种元编程,你关心一个变量的名字。因此你可以做到这一点。
use strict;
...
for (qw/var1 var2 var3/)
{
no strict 'refs';
die "$_ is not defined" if !defined ${$_};
}
考虑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很疯狂,可能并不是做任何你想做的事情的最好方式,但它偶尔会让人迷惑。
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
循环中,而子程序内,我们需要沃尔玛k通过使用varname(1, ...
支持一个额外的级别。
也可能感兴趣的是given/when
语句不使用别名,虽然他们给出了这样做的外观。因此,PadWalker无法追溯到given(...)
中指定的变量。
我对此表示怀疑(如果你可以做到这一点,那么这个名单是什么意思?($ var1,undef,$ var2){...')。但是有很多次我不认为在Perl中可以完成某些工作,而且我错了。 – mob