आप अपने 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(...);
स्रोत
2009-02-13 05:32:51
आप जो कुछ भी चाहते हैं उसे "कह सकते हैं" कर सकते हैं। यह काम करने के लिए मुश्किल हो रहा है :) –