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

前端之家收集整理的这篇文章主要介绍了如何在Perl中使用符号引用?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在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是用我们声明的.符号引用仅适用于符号表中的值.换句话说,词法变量不适用于符号引用.

如果我没有强调这一点,请不要使用符号引用.

猜你在找的Perl相关文章