2008-11-25 88 views
0

简单问题:如何在Perl中引用哈希引用中的标量?

如何做到这一点的一条线:

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

我试过\ $酒吧 - > {}巴兹,\ $ {$栏 - > {巴兹}},和许多其他人。这甚至有可能吗?

-fREW

更新:确定,hashref从DBI来了,我传递的标裁判成模板工具包。我想现在我更仔细地看待这个问题,TT如何处理所有这些问题。有效地我想说:

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

但TT不工作的方式,TT采用标量ref和把数据在那里,所以我不得不这样做:

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

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

+0

。这允许您多次处理模板中的块... $ template-> process(“table.tt/row”,{data => 1});然后在table.tt模板中[%BLOCK row%] ​​[%data%] [%END%] – draegtun 2008-11-25 19:46:45

+0

关于您的更新,请参阅我的答案更新。 – runrig 2009-01-05 03:57:06

回答

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,这将创建一个参考的数组。以上将分发参考资料并列出两个参考资料。

0

我甚至不知道你在做什么。 你也应该在巴兹附近引号。

现在让我们考虑您将标量分配给第一行中的标量,然后第二行应该工作。 但是我不知道这是你在这里尝试的,它在Perl中并没有什么意义。 使用引用往往是在其他语言中使用

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

现在第一一般不需要用标量反正Perl是一种脚本语言,所以,如果你真的关心速度写C.

二是不需要在Perl中,你可以返回列表和对匿名哈希的引用很容易。

你看过“man perlref”吗?

2

你没有表现出%的酒吧和嘶嘶声()是如何设置的,所以我将它们像这样:

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

\ $酒吧 - > {}巴兹似乎这样的伎俩对我来说:基于我觉得你可能尝试做ü应该看看在TT EXPOSE_BLOCKS选项

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