我有一行代码:
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 :(得分:22)
请参阅http://perldoc.perl.org/functions/print.html
请注意,如果您要存储 数组中的FILEHANDLE,或者如果你是 使用任何其他表达式更多 复杂而不是标量变量 检索它,你将不得不使用 阻止返回文件句柄值 相反:......
因此,在您的情况下,您将使用这样的块:
print { $somehash{$var}{fh} } "foo";
答案 1 :(得分: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( ... );
答案 2 :(得分:5)
以上答案都是正确的。他们不允许在print FH LIST
中进行完整表达的原因已经是非常奇怪的语法。要把更复杂的东西放在那里会引入大量模棱两可的语法。该块消除了这种模糊性。
要了解这种疯狂导致的地方,请考虑间接对象语法的恐怖。
foo $bar; # Is that foo($bar) or $bar->foo()? Good luck!