2009-02-12 27 views
8

我的代碼線沿線的線路:

print $somehash{$var}{fh} "foo"; 

哈希包含文件句柄幾級了。錯誤是:

String found where operator expected at test.pl line 10, near "} "foo"" 

我可以這樣修復:

my $fh = $somehash{$var}{fh}; 
print $fh "foo"; 

...但有一個班輪?

+0

你可以「說」你想要的任何東西。它是得到它的工作,是棘手的:) – 2010-08-31 19:20:42

回答

23

看到http://perldoc.perl.org/functions/print.html

需要注意的是,如果你存儲在數組 文件句柄,或者如果你使用任何其他表達更復雜 比標量變量 是 檢索,你將不得不使用 塊返回文件句柄值 代替:...

所以,在你的CAS E,你會使用塊這樣的:

print { $somehash{$var}{fh} } "foo"; 
+2

優秀的答案,只是爲了使其具體: print {$ somehash {$ var} {fh}}「foo」; – andy 2009-02-12 23:58:20

10

如果您有一個簡單的標量作爲你的文件句柄的其他任何東西,你需要用的基準保持的文件句柄在大括號這樣的Perl知道如何解析的語句:

print { $somehash{$var}{fh} } $foo; 

Perl的最佳實踐的一部分說總是包裹在花括號中的文件句柄只是因爲這個原因,雖然我沒有得到它的堅果。

語法是奇怪,因爲print是一個文件句柄對象上的間接方法:

method_name Object @arguments; 

你可能在老學校CGI.pm已經看到了這一點。這裏有兩個間接方法調用:

use CGI; 

my $cgi_object = new CGI 'cat=Buster&bird=nightengale'; 

my $value = param $cgi_object 'bird'; 

print "Indirect value is $value\n"; 

,幾乎能正常工作(見Schwern's answer about the ambiguity)只要對象是一個簡單的標量。但是,如果我將$cgi_object放在散列表中,我會得到與print相同的語法錯誤。我可以在哈希訪問中加上大括號來使其工作。

my %hash; 

$hash{animals}{cgi} = $cgi_object; 

# $value = param $hash{animals}{cgi} 'cat'; # syntax error 
$value = param { $hash{animals}{cgi} } 'cat'; 
print "Braced value is $value\n"; 

這一切有點笨重所以只需使用箭頭符號的一切,而不是:與前面的代碼繼續

my $cgi_object = CGI->new(...); 
$cgi_object->param(...); 

$hash{animals}{cgi}->param(...); 

你可以做的文件句柄一樣,儘管你必須使用IO::Handle模塊,使其全部工作:

use IO::Handle; 

STDOUT->print('Hello World'); 

open my($fh), ">", $filename or die ...; 
$fh->print(...); 

$hash{animals}{fh} = $fh; 

$hash{animals}{fh}->print(...); 
5

上述答案都是正確的。他們不允許在那裏完整表達的原因是print FH LIST已經很奇怪的語法。把任何更復雜的東西都會引入大量模糊的語法。該塊消除了這種模糊性。

要查看這個瘋狂導致的位置,請考慮間接對象語法的恐怖。

foo $bar; # Is that foo($bar) or $bar->foo()? Good luck!