首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Perl中使用符号引用?

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

Stack Overflow用户
提问于 2009-08-19 06:06:12
回答 6查看 3.4K关注 0票数 4

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

例如,让

代码语言:javascript
复制
$name = "bob";
@bob = ("jerk", "perlfan");

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-08-19 07:54:34

以下几点:

  • 你谈论的不是typeglobs,而是symbolic --它们导致很难找到bug。
  • 几乎在任何符号引用看起来是个好主意的情况下,使用基于散列的数据结构是最好的approach.
  • Consider当你不想改变them.
  • Symbolic引用时使用Hash::Util来锁定你的散列不适用于词法variables.
  • Typeglobs不适用于词法variables.
  • Use词法variables.
  • Don't使用符号引用。

有关引用(符号引用和其他引用)的更多信息,请参见perlreftut。有关使用数据结构的帮助,请参阅perldsc。有关typeglobs的更多信息,请参阅perlmod。有关词法变量的更多信息,请参阅perlsub

下面是一个使用锁定散列根据变量内容控制数据访问的示例:

代码语言:javascript
复制
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;
}

抛开所有警告不谈,如果你需要使用符号引用(但你不会使用它),使用它的语法是:

代码语言:javascript
复制
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声明的。符号引用仅适用于符号表中的值。换句话说,词法变量不适用于符号引用。

如果我没有足够强调这一点,不会使用符号引用。

票数 18
EN

Stack Overflow用户

发布于 2009-08-19 06:39:14

这是非常糟糕的做法。如果你曾经需要这样做,这意味着你应该重构你的代码。也许使用带有命名键的散列会更好:

代码语言:javascript
复制
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";
票数 13
EN

Stack Overflow用户

发布于 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 2Part 3)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1298035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档