在Perl中,如果一个变量保存另一个变量的名称,如何使用第一个变量访问另一个变量?
例如,让
$name = "bob";
@bob = ("jerk", "perlfan");我应该如何使用$name来了解bob是什么样的人?虽然我不太确定,但我模糊的记忆告诉我它可能与typeglob有关。
发布于 2009-08-19 07:54:34
以下几点:
有关引用(符号引用和其他引用)的更多信息,请参见perlreftut。有关使用数据结构的帮助,请参阅perldsc。有关typeglobs的更多信息,请参阅perlmod。有关词法变量的更多信息,请参阅perlsub。
下面是一个使用锁定散列根据变量内容控制数据访问的示例:
use strict;
use warnings;
use Hash::Util qw( lock_hash unlock_hash );
my %data;
lock_hash( %data );
#Altering %data is a fatal exception.
unlock_hash( %data );
%data = (
'bob' => [ 'jerk', 'genius' ],
);
lock_hash( %data );
for my $name (qw/ bob margaret /) {
my $info = $data{$name}; # Fatal error when accessing data for margaret.
print "$name is a\n";
print map "\t$_\n", @$info;
}抛开所有警告不谈,如果你需要使用符号引用(但你不会使用它),使用它的语法是:
use strict;
use warnings;
my $name = 'bob';
our @bob = qw/jerk genius/;
my $qualities;
{ no strict 'refs';
print "$name: ", @$name, "\n";
$qualities = \@$name;
}
print "$name is a @$qualities\n"; 注意,数组@bob是用our声明的。符号引用仅适用于符号表中的值。换句话说,词法变量不适用于符号引用。
如果我没有足够强调这一点,不会使用符号引用。
发布于 2009-08-19 06:39:14
这是非常糟糕的做法。如果你曾经需要这样做,这意味着你应该重构你的代码。也许使用带有命名键的散列会更好:
my %data = (
'bob' => [ 'jerk', 'perlfan' ],
);
my $name = 'bob';
print $data{ $name }->[0], "\n";
print $data{ $name }->[1], "\n";
my $stringified = join ' and ', @{ $data{ $name } };
print $stringified, "\n";发布于 2009-08-19 10:52:30
请参阅perldoc -q "variable name"
初学者通常认为他们希望变量包含变量的名称。..。
简短的回答:不要。长期的回答:阅读FAQ条目(在您的计算机上也可以找到)。更长的答案:阅读MJD的Why it's stupid to "use a variable as a variable name" (Part 2,Part 3)。
https://stackoverflow.com/questions/1298035
复制相似问题