2015-01-20 10 views
6

मुझे समझ में क्यों IO::Fileuse autodie के साथ काम नहीं लगता है कोशिश कर रहा हूँपर्ल आईओ :: फाइल ऑटोडी के साथ काम करता है?</p> <p><strong>उदाहरण # 1</strong>:: टेस्ट कार्यक्रम <code>open</code> का उपयोग कर:

Can't open 'bogus_file' for reading: 'No such file or directory' at ./test.pl line 9 
:

#! /usr/bin/env perl 
# 
use strict; 
use warnings; 
use feature qw(say); 
use autodie; 
use IO::File; 

open(my $fh, "<", "bogus_file"); 
# my $fh = IO::File->new("bogus_file", "r"); 
while (my $line = $fh->getline) { 
    chomp $line; 
    say qq(Line = "$line"); 
} 

इस के साथ विफल

ऐसा लगता है कि autodie काम कर रहा है।

उदाहरण # 2: वही परीक्षण कार्यक्रम है, लेकिन अब IO::File का उपयोग कर:

Can't call method "getline" on an undefined value at ./test.pl line 11. 

लगता autodie की तरह बुरा IO::File->new खुला समझ नहीं आया:

#! /usr/bin/env perl 
# 
use strict; 
use warnings; 
use feature qw(say); 
use autodie; 
use IO::File; 

# open(my $fh, "<", "bogus_file"); 
my $fh = IO::File->new("bogus_file", "r"); 
while (my $line = $fh->getline) { 
    chomp $line; 
    say qq(Line = "$line"); 
} 

इस के साथ विफल रहता है।

फिर भी, जहां तक ​​मैं कह सकता हूं, IO::File->new नीचे open का उपयोग करता है।

sub new { 
    my $type = shift; 
    my $class = ref($type) || $type || "IO::File"; 
    @_ >= 0 && @_ <= 3 
     or croak "usage: $class->new([FILENAME [,MODE [,PERMS]]])"; 
    my $fh = $class->SUPER::new(); 
    if (@_) { 
     $fh->open(@_) # <-- Calls "open" method to open file. 
      or return undef; 
    } 
    $fh; 
} 

sub open { 
    @_ >= 2 && @_ <= 4 or croak 'usage: $fh->open(FILENAME [,MODE [,PERMS]])'; 
    my ($fh, $file) = @_; 
    if (@_ > 2) { 
     my ($mode, $perms) = @_[2, 3]; 
     if ($mode =~ /^\d+$/) { 
      defined $perms or $perms = 0666; 
      return sysopen($fh, $file, $mode, $perms); 
     } elsif ($mode =~ /:/) { 
      return open($fh, $mode, $file) if @_ == 3; 
      croak 'usage: $fh->open(FILENAME, IOLAYERS)'; 
     } else { 
      # <--- Just a standard "open" statement... 
      return open($fh, IO::Handle::_open_mode_string($mode), $file); 
     } 
    } 
    open($fh, $file); 
} 

क्या autodie अपेक्षा के अनुरूप काम करने के लिए नहीं पैदा: यहाँ IO::File से कोड है?

+5

मेरी समझ यह है कि 'autodie' lexically scoped है। इसलिए यह आपकी फ़ाइल में 'ओपन' पर कॉल बदलता है, लेकिन आईओ :: फ़ाइल के भीतर नहीं। – tjd

+0

मेरी इच्छा है कि पर्ल्डोक थोड़ा और विशिष्ट था - या तो 'आईओ :: फाइल' या' ऑटोोडी 'परल्डोक। ऑटोडी का कहना है कि यह स्पष्ट रूप से स्कॉप्ड है, लेकिन फिर यह दिखाता है कि ब्लॉक में इसका उपयोग कैसे किया जाए। चेतावनी भी स्पष्ट रूप से स्कॉप्ड है, लेकिन मुझे लगता है कि मैंने इसे पहले नहीं देखा था। आपके उत्तर के लिए धन्यवाद। यह प्रकार 'autodie' का उपयोग थोड़ा कम उपयोगी बनाता है। –

+0

@ डेविड डब्ल्यू, क्या? नहीं। ऑटोडी पूरी तरह से बेकार होगा अगर यह आपके पूरे दुभाषिया के लिए सब कुछ या कुछ भी नहीं था। – ikegami

उत्तर

5

autodie व्याख्यात्मक रूप से स्कॉप्ड है। इसलिए यह आपकी फ़ाइल में open पर कॉल (लपेटें) कॉल करता है, लेकिन IO::File के भीतर नहीं।

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