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

标签 perl variables

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

例如,让

$name = "bob";
@bob = ("jerk", "perlfan");

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

最佳答案

几点:

  • 您不是在谈论类型团,而是在谈论 符号引用 .
  • 不要使用符号引用——它们会导致难以追踪错误。
  • 在几乎所有符号引用看起来是个好主意的情况下,使用基于散列的数据结构是最好的方法。
  • 当您不想更改它们时,请考虑使用 Hash::Util 来锁定您的散列。
  • 符号引用不适用于词法变量。
  • Typeglobs 不适用于词法变量。
  • 使用词法变量。
  • 不要使用符号引用。

  • perlreftut有关引用(符号和其他)的更多信息。
    perldsc获取使用数据结构的帮助。
    perlmod有关 typeglob 的更多信息。
    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声明为 our .符号引用仅适用于符号表中的值。换句话说,词法变量不适用于符号引用。

    以防万一我没有足够强调这一点,不要使用符号引用 .

    关于perl - 如何在 Perl 中使用符号引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1298035/

    相关文章:

    javascript - 如何将框架集 col 值设置为变量

    perl - 如何在 Perl 中实现 QT(质量阈值)聚类?

    perl - 仅当键没有值时如何删除哈希键?

    linux - 如何采用成对的线并连接起来?

    perl - 从 Perl 中的字符串执行整个 Perl 程序

    javascript - 设置变量时破坏游戏代码

    perl - Mojolicious 一个带有列表目录的服务状态文件的类轮

    Javascript:变量值在回调中使用之前发生变化

    Javascript:带有 document.activeElement 的变量

    c++ - 如何使用指针编写具有可变数量的参数的函数?