如何在Perl中引用哈希引用中的标量?

时间:2008-11-25 16:54:25

标签: perl syntax dbi template-toolkit

简单问题:

我如何在一行上执行此操作:

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

我尝试过\ $ bar-> {baz},\ $ {$ bar-> {baz}}以及其他许多人。这甚至可能吗?

-fREW

更新:好的,hashref来自DBI,我将标量引用传递给模板工具包。我想现在我更仔细地看待这个问题与TT如何做到这一点有关。实际上,我想说:

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

但是TT没有那样工作,TT采用标量引用并将数据放在那里,所以我必须这样做:

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

无论如何,谢谢你的帮助。我至少只有一个参考而不是两个。

4 个答案:

答案 0 :(得分:5)

\$bar->{baz}

应该有用。

E.g:

my $foo;
$foo->{bar} = 123;

my $bar = \$foo->{bar};

$$bar = 456;

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

在回答OP中的更新时,您可以这样做:

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

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

答案 1 :(得分:4)

\ $ 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 

答案 2 :(得分:2)

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

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

然后,这两个工作,你的orignal:

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

您说过的其中一个变种:

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

你能否显示给你的错误?

答案 3 :(得分:0)

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

现在让我们考虑在第一行中为标量指定标量,然后第二行应该有效。 但是我真的不知道这是不是你在这里尝试的东西,它在Perl中确实没有意义。 使用引用通常用于其他语言

  1. 加快功能调用
  2. 允许返回多个值。
  3. 现在第一个通常不需要使用标量,反正Perl是一种脚本语言,所以如果你真的关心速度写C。

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

    你看过“man perlref”吗?