代码之家  ›  专栏  ›  技术社区  ›  Evan Carroll

如何在Perl的散列引用中引用标量?

  •  0
  • Evan Carroll  · 技术社区  · 16 年前

    简单问题:

    如何在一条线上执行此操作:

    my $foo = $bar->{baz};
    fizz(\$foo);
    

    我尝试过\$bar->baz、\$$bar->baz和许多其他方法。这是可能的吗?

    -弗鲁

    更新 :好的,hashref来自dbi,我正在将scalar-ref传递到模板工具包中。我想现在我看得更仔细了,问题在于TT是如何做到这一切的。实际上,我想说:

    $template->process(\$row->{body}, $data);
    

    但TT不是这样工作的,它接受一个标量引用并将数据放在那里,所以我必须这样做:

    $template->process(\$row->{body}, $shopdata, \$row->{data});
    

    不管怎样,谢谢你的帮助。我至少只有一个参考而不是两个。

    4 回复  |  直到 16 年前
        1
  •  5
  •   runrig    16 年前
    \$bar->{baz}
    

    应该工作。

    例如。:

    my $foo;
    $foo->{bar} = 123;
    
    my $bar = \$foo->{bar};
    
    $$bar = 456;
    
    print "$foo->{bar}\n";   # prints "456"
    

    为了响应OP中的更新,您可以执行以下操作:

    \@$row{qw(body data)};
    

    这与\@数组不同,后者将创建对数组的一个引用。以上将分发参考文献,并列出两个参考文献。

        2
  •  4
  •   Yanick    16 年前

    \$bar->baz似乎对我有好处:

    my $bar = { baz => 1 };
    print $bar->{baz}, "\n";  # prints 1
    my $ref =  \$bar->{baz};
    print $$ref, "\n";        # prints 1
    $$ref = 2;
    print $bar->{baz}, "\n";  # prints 2 
    
        3
  •  2
  •   jimtut    16 年前

    您没有显示%bar和fizz()是如何设置的,所以我按如下方式设置它们:

    my %hash;
    my $bar = \%hash;
    $hash{baz} = "found it\n";
    sub fizz {
      my $ref = shift;
      print $$ref;
    }
    

    然后,这两项工作,你的原名:

    my $foo = $bar->{baz};
    fizz(\$foo);
    

    你说你尝试过的其中一种变体是:

    fizz(\$bar->{baz});
    

    你能指出给你的错误吗?

        4
  •  0
  •   Ralf    16 年前

    我甚至不知道你在做什么。 你也应该在baz周围加上引号。

    现在让我们考虑为第一行中的标量分配一个标量,然后第二行就可以工作了。 不过,我不知道这是否是您在这里尝试的,在Perl中也没有真正意义。 在其他语言中,使用引用通常用于

    1. 加速函数调用
    2. 允许返回多个值。

    现在,第一种通常不需要使用scalar,而且无论如何,Perl是一种脚本语言,所以如果您真正关心的是速度写C。

    在Perl中不需要第二个,因为您可以很容易地返回对匿名散列的列表和引用。

    你看过“ManPerlRef”吗?