如何在Perl中使用符号引用?

Hai*_*ang 4 variables perl

在Perl中,如果变量保存另一个变量的名称,如何使用第一个变量访问另一个变量?

例如,让我们

$name = "bob";
@bob = ("jerk", "perlfan");
Run Code Online (Sandbox Code Playgroud)

我该怎么用$ name来了解bob是什么样的人?虽然我不太确定,但我模糊的记忆告诉我它可能与typeglob有关.

dao*_*oad 18

几点:

  • 你不是在谈论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;
}
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)

  • +1以避免不良做法要好于找到让不良做法发生的方法 (2认同)