Nếu bạn có bất cứ điều gì khác hơn là một đại lượng vô hướng đơn giản như filehandle của bạn, bạn cần phải quấn tham khảo giữ filehandle trong dấu ngoặc để Perl biết làm thế nào để phân tích báo cáo kết quả:
print { $somehash{$var}{fh} } $foo;
Một phần của Perl Thực tiễn tốt nhất nói luôn quấn filehandles trong dấu ngoặc chỉ vì lý do này, mặc dù tôi không có được điều đó hấp dẫn với nó.
Cú pháp là số lẻ vì print
là một phương pháp gián tiếp vào một đối tượng filehandle:
method_name Object @arguments;
Bạn có thể thấy điều này trong trường học cũ CGI.pm. Dưới đây là hai phương pháp gián tiếp cuộc gọi:
use CGI;
my $cgi_object = new CGI 'cat=Buster&bird=nightengale';
my $value = param $cgi_object 'bird';
print "Indirect value is $value\n";
Đó gần như hoạt động tốt (xem Schwern's answer about the ambiguity) miễn là các đối tượng nằm trong một vô hướng đơn giản. Tuy nhiên, nếu tôi đặt $cgi_object
trong một băm, tôi nhận được cùng một lỗi cú pháp bạn nhận được với print
. Tôi có thể đặt niềng răng xung quanh truy cập băm để làm cho nó hoạt động. Tiếp tục với mã theo thời gian:
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";
Đó là tất cả một chút thời gian vì vậy chỉ cần sử dụng các ký hiệu mũi tên cho tất cả mọi thứ thay vì:
my $cgi_object = CGI->new(...);
$cgi_object->param(...);
$hash{animals}{cgi}->param(...);
Bạn có thể làm tương tự với filehandles, mặc dù bạn phải sử dụng IO::Handle mô-đun để làm cho tất cả hoạt động:
use IO::Handle;
STDOUT->print('Hello World');
open my($fh), ">", $filename or die ...;
$fh->print(...);
$hash{animals}{fh} = $fh;
$hash{animals}{fh}->print(...);
Bạn có thể "nói" bất cứ điều gì bạn muốn. Nó nhận được nó để làm việc đó là khôn lanh :) –