2009-02-12 19 views
8

:

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

satırında bir satırlık kodum var. Karma, dosya düzeyini birkaç düzey aşağısında içerir. Hata:

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

Bunu yaparak bunu düzeltebilirim:

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

... ama tek liner var mı?

+0

İstediğiniz herhangi bir şeyi "söyleyebilir". Bu zor çalışmak için oluyor :) –

cevap

23

Bir dizide bir filehandles depolamak eğer o http://perldoc.perl.org/functions/print.html

Not, görür ya bir skaler değişken dışında herhangi ifadeyi daha kompleksi kullanılarak iseniz geri almak, sen ... senin cas Yani

, a blok yerine dt değeri dönen kullanmak zorunda olacak E, böyle bir blok kullanmak: Eğer dosya tanıtıcısına olarak basit sayısal alan dışında bir şey varsa

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

Mükemmel cevap ve sadece beton yapmak için: print {$ somehash {$ var} {fh}} "foo"; – andy

+0

İyi nokta @andy, cevabı bu kod satırını içerecek şekilde düzenledim. Düzenlemeler burada hoş geldiniz, bir dahaki sefere git. – Flimm

10

, sen Perl deyimi ayrıştırmak bilir böylece ayraç dosya tanıtıcısından tutan başvuru kaydırmak gerekir: Perl En İyi Uygulamalar

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

Bölüm onunla o çatlak almamış her zaman sadece bu sebeple ayraç filehandles sarmak için söylüyor. Eski okul CGI.pm bu görmüş olabilir

method_name Object @arguments; 

: print bir dt nesne üzerinde dolaylı bir yöntemdir çünkü

sözdizimi garip. Neredeyse çalışıyor

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 bakınız) sürece amacı, basit bir sayısal alan olduğu gibi: İşte iki dolaylı yöntem aramalarıdır. Ancak, $cgi_object bir hash koyarsanız, print ile aldığınız aynı sözdizimi hatasını alıyorum. Çalışmasını sağlamak için parantezleri karma erişimin etrafına yerleştirebilirim. Eğer IO::Handle kullanmak zorunda olmasına rağmen, Sen filehandles Aynı işlemleri

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

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

: hepsini biraz aksak var

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"; 

böylece sadece yerine her şey için ok biçimi kullanın: Önceki kod ile devam modülün herşeyi halletmesi için:

use IO::Handle; 

STDOUT->print('Hello World'); 

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

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

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

Yukarıdaki cevaplar doğrudur. Orada tam bir ifadeye izin vermeme nedeni print FH LIST zaten oldukça garip bir sözdizimi. Orada daha karmaşık bir şey koymak için bir ton belirsiz sözdizimi getirecekti. Blok bu belirsizliği kaldırdı.

Bu deliliğin nereye gittiğini görmek için, dolaylı nesne sözdizimi olan dehşeti düşünün.

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