有沒有辦法在不使用符號鏈接的情況下知道變量名稱?在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