2009-02-12 15 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

आप जो कुछ भी चाहते हैं उसे "कह सकते हैं" कर सकते हैं। यह काम करने के लिए मुश्किल हो रहा है :) –

उत्तर

23

देख http://perldoc.perl.org/functions/print.html

ध्यान दें कि आप एक सरणी में FILEHANDLEs भंडारण कर रहे हैं, या यदि आप कर रहे हैं को एक अदिश चर के अलावा कोई अन्य अभिव्यक्ति अधिक जटिल का उपयोग कर इसे पुनः प्राप्त है, तो आप filehandle मूल्य लौटने के बजाय एक ब्लॉक का उपयोग करना होगा: ...

तो, अपने cas में ई, तो आप इस तरह एक ब्लॉक का प्रयोग करेंगे:

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

उत्कृष्ट जवाब, और इसे कंक्रीट बनाने के लिए: प्रिंट {$ somehash {$ var} {fh}} "foo"; – andy

+0

अच्छा बिंदु @andy, मैंने कोड की उस पंक्ति को शामिल करने के लिए उत्तर संपादित किया। संपादन का स्वागत है, इसे अगली बार जाने दें। – Flimm

10

आप अपने filehandle के रूप में एक सरल अदिश के अलावा और कुछ है, तो आप ब्रेसिज़ में filehandle पकड़े तो पर्ल जानता है कि कैसे बयान पार्स करने के लिए संदर्भ रैप करने के लिए की जरूरत है:

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

पर्ल उत्तम आचरण का एक हिस्सा कहते हैं हमेशा से ही इस कारण के लिए ब्रेसिज़ में filehandles रैप करने के लिए है, हालांकि मुझे लगता है कि इसके साथ अखरोट के स्वाद का नहीं मिलता है।

method_name Object @arguments; 

आप ओल्ड-स्कूल CGI.pm में यह देखा हो सकता है: क्योंकि print एक filehandle वस्तु पर एक अप्रत्यक्ष विधि है

वाक्य रचना अजीब है।

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(...); 

आप filehandles साथ भी ऐसा ही कर सकते हैं, हालांकि आप 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! 
संबंधित मुद्दे