在Perl中,如果变量保存另一个变量的名称,如何使用第一个变量访问另一个变量?
例如,让我们
$name = "bob";
@bob = ("jerk", "perlfan");
Run Code Online (Sandbox Code Playgroud)
我该怎么用$ name来了解bob是什么样的人?虽然我不太确定,但我模糊的记忆告诉我它可能与typeglob有关.
dao*_*oad 18
几点:
有关参考文献的更多信息,请参阅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;
}
Run Code Online (Sandbox Code Playgroud)
抛开所有警告,你需要使用符号引用的语法(但你不会):
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";
Run Code Online (Sandbox Code Playgroud)
请注意,数组@bob是使用声明的our.符号引用仅适用于符号表中的值.换句话说,词法变量不适用于符号引用.
如果我没有强调这一点,请不要使用符号引用.
小智 13
这是非常糟糕的做法.如果你曾经需要做的,这意味着你应该重构你的代码.也许带有命名键的哈希会更好:
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";
Run Code Online (Sandbox Code Playgroud)