2010-09-15 18 views
5

किसी कारण से, मुझे Expect.pm की log_file विधि के साथ काम करने वाले फ़ाइल हैंडल नहीं मिल सकते हैं। मुझे मूल रूप से How can I pass a filehandle to Perl Expect's log_file function? पर सहायता मिली, जहां यह सुझाव दिया गया था कि मैं विधि को पास करने के लिए आईओ :: हैंडल फ़ाइलहेडल का उपयोग करता हूं। यह एक अलग मुद्दा प्रतीत होता है, इसलिए मैंने सोचा कि मैं एक नया प्रश्न शुरू करूंगा।मेरा पर्ल धन्य फ़ाइलहेड क्यों नहीं कर सकता है 'can (' print ')' 'के साथ सच नहीं है?

यह Expect.pm की अपमानजनक अनुभाग है:

if (ref($file) ne 'CODE') { 
    croak "Given logfile doesn't have a 'print' method" 
    if not $fh->can("print"); 
    $fh->autoflush(1);  # so logfile is up to date 
} 

तो, तो, मैं इस नमूना कोड की कोशिश की:

use IO::Handle; 
open $fh, ">>", "file.out" or die "Can't open file"; 
$fh->print("Hello, world"); 
if ($fh->can("print")) 
{ 
    print "Yes\n"; 
} 
else 
{ 
    print "No\n"; 
} 

जब मैं इस चलाने के लिए, मैं दो (मेरे विचार से) विरोधी आइटम। एक पंक्ति वाली एक फ़ाइल जो 'हैलो, वर्ल्ड' और 'नो' के आउटपुट कहती है। मेरे दिमाग में, $fh->can लाइन सही होनी चाहिए। क्या मैं यहाँ गलत हूँ?

+2

'सख्त उपयोग करें; चेतावनियों का उपयोग करें; ' – Ether

+0

मेरे पास कोई जवाब नहीं है कि यह अजीब क्यों काम कर रहा है, लेकिन मुझे संदेह है कि इसका हिस्सा आईओ से आता है :: हैंडल सामान्य श्रेणी नहीं है। उनमें से कुछ सामान्य मॉड्यूल के रूप में रहने के बजाय पर्ल स्रोत के अंदर है। यह एक बग रिपोर्ट के लायक हो सकता है (perlbug का उपयोग करें) :) –

उत्तर

5

विषम, ऐसा लगता है कि आपको काम करने के लिए can विधि प्राप्त करने के लिए वास्तविक IO::File ऑब्जेक्ट बनाने की आवश्यकता है।

use IO::File; 

my $fh = IO::File->new("file.out", ">>") 
    or die "Couldn't open file: $!"; 
+0

प्रयुक्त IO :: फ़ाइल। आपकी मदद के लिए एक बार फिर धन्यवाद। –

2

IO::Handleopen() समारोह ओवरलोड नहीं है, इसलिए आप वास्तव में $fh में एक IO::Handle वस्तु हो रही नहीं कर रहे हैं। मुझे नहीं पता कि $fh->print("Hello, world") लाइन काम क्यों करती है (संभवतः क्योंकि आप print() फ़ंक्शन को कॉल कर रहे हैं, और जब आप $foo->function जैसी चीजें करते हैं तो यह function $foo के बराबर है, इसलिए आप अनिवार्य रूप से फ़ाइलहेडल को प्रिंट कर रहे हैं जैसे कि आप आमतौर पर अपेक्षा करते हैं)।

आप की तरह कुछ करने के लिए अपने कोड को बदलते हैं:

use strict; 
use IO::Handle; 
open my $fh, ">>", "file.out" or die "Can't open file"; 
my $iofh = new IO::Handle; 
$iofh->fdopen($fh, "w"); 
$iofh->print("Hello, world"); 
if ($iofh->can("print")) 
{ 
    print "Yes\n"; 
} 
else 
{ 
    print "No\n"; 
} 

... फिर अपने कोड के रूप में आप उम्मीद करेंगे। कम से कम ये मेरे लिए करता है!

+0

आप 'आईओ :: फाइल' का उपयोग करने के बजाय' ओपन' + 'fdopen' का उपयोग क्यों कर रहे हैं? – cjm

+0

क्योंकि मुझे चाओ के जवाब को तब तक 'आईओ :: फाइल' के बारे में नहीं पता था। मेरे पास मस्तिष्क पर 'आईओ :: हैंडल' था क्योंकि मैंने सोचा था कि ओपी का उपयोग करना चाहता था। – CanSpice

+0

मुझे आईओ :: फाइल के बारे में भी पता नहीं था जब तक कि मैंने इसे अभी तक नहीं देखा। एक बार फिर आपकी मदद के लिए धन्यवाद! हमेशा एक सीखने का अनुभव। –

संबंधित मुद्दे