gpt4 book ai didi

Perl,按其他标量中的名称访问变量

转载 作者:行者123 更新时间:2023-12-01 07:44:14 27 4
gpt4 key购买 nike

我很确定这适用于 perl,但我不知道如何编码。
我可以用 eval 来想象它,但这不是我要找的。

my $foo = 0;
my $varname = "foo";


$($varname) = 1; # how to do this?
# I want to access a scalar that name is in a other scalar
# so $foo should be 1 now.

谢谢

最佳答案

Perl 有两个独立但在很大程度上兼容的变量系统。

包变量,可以是完全限定名称 $Some::Package::variable 或使用 our 声明的词法名称。包变量存在于符号表中,对整个程序是全局的,可以是符号解引用的目标,并且可以通过 local 赋予动态范围。

my 声明的词法变量构成了另一个变量系统。这些变量不存在于包或符号表中(而是存在于附加到作用域的词法垫中)。这些变量不是全局的,不能被符号引用,也不能有动态范围。这就是为什么你不能使用 $$varname 并期望它找到一个词法变量。

你有几种方法来处理这个问题:

  • 使用包变量,可以是完全限定名称,也可以是用 our 声明的,严格禁止并使用符号引用:
    our $x = 1;
    our $y = 'x';
    say $x; # 1
    $$y = 5; # this line is an error if `use strict` is loaded
    say $x; # 5
  • 使用包变量并遍历符号表:
    $main::x = 1;
    my $y = 'x';

    ${$main::{$y}} = 5; # ok with `use strict`
    say $main::x; # 5
  • 最佳实践方式是使用散列(这是上面两个示例在幕后所做的,因为符号表本身就是一个散列)
    my %data = (x => 1);
    my $y = 'x';
    $data{$y} = 5;
    say $data{x}; # 5

  • 符号引用的危险在于将您的程序变成意大利面条式代码或覆盖您不打算覆盖的变量通常太容易了。通过使用显式散列,您可以将您正在做的事情的魔力限制在一个明确定义和有限的范围内。散列本身可以是词法的,允许对变量进行适当的自动垃圾收集。

    关于Perl,按其他标量中的名称访问变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6285652/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com