我有一行代码:
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";
......但是有一个单行程吗?
见http://perldoc.perl.org/functions/print.html
请注意,如果您将FILEHANDLE存储在数组中,或者如果您正在使用比标量变量更复杂的任何其他表达式来检索它,则必须使用一个块来返回文件句柄值:...
所以,在你的情况下,你会使用这样的块:
print { $somehash{$var}{fh} } "foo";
如果除了一个简单的标量之外还有文件句柄,你需要将文件句柄包含在大括号中,以便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关于模糊性的答案).但是,如果我放$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( ... );
以上答案都是正确的.他们不允许在那里完整表达的原因print FH LIST
已经是非常奇怪的语法.要把更复杂的东西放在那里会引入大量模棱两可的语法.该块消除了这种模糊性.
要了解这种疯狂导致的地方,请考虑间接对象语法的恐怖.
foo $bar; # Is that foo($bar) or $bar->foo()? Good luck!