在Perl中,如果变量保存另一个变量的名称,如何使用第一个变量访问另一个变量?
例如,让我们
$name = "bob"; @bob = ("jerk","perlfan");
我该怎么用$name来了解bob是什么样的人?
虽然我不太确定,但我模糊的记忆告诉我它可能与typeglob有关.
解决方法
几点:
>你不是在谈论typeglobs,而是在谈论符号引用.
>不要使用符号引用 – 它们导致难以追踪错误.
>在几乎任何情况下,符号引用似乎都是个好主意,使用基于哈希的数据结构是最好的方法.
>当您不想更改哈希值时,请考虑使用Hash :: Util来锁定哈希值.
>符号引用不适用于词法变量.
> Typeglobs不适用于词法变量.
>使用词汇变量.
>不要使用符号引用.
有关参考文献的更多信息,请参阅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是用我们声明的.符号引用仅适用于符号表中的值.换句话说,词法变量不适用于符号引用.
如果我没有强调这一点,请不要使用符号引用.