2008-11-25 48 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