2015-01-20 4 views
6

Ich versuche zu verstehen, warum IO::File nicht mit use autodie zu funktionieren scheint:Perl Funktioniert IO :: File mit Autodie?

Beispiel # 1: Testprogramm mit open:

#! /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"); 
} 

Dies scheitert mit:

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

Es sieht aus wie autodie funktioniert.

Beispiel # 2: Same Testprogramm, aber jetzt mit IO::File:

#! /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"); 
} 

Dies schlägt mit:

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

Sieht aus wie autodie nicht die schlechte IO::File->new offen fangen haben.

Noch, soweit ich das beurteilen kann, IO::File->new verwendet open darunter. Hier ist der Code von IO::File:

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); 
} 

Was autodie verursacht nicht wie erwartet funktionieren?

+5

Mein Verständnis ist, dass "Autodie" lexikalisch ist. Daher ändert es die Aufrufe von 'open' in Ihrer Datei, aber nicht in IO :: File. – tjd

+0

Ich wünschte, der Perldoc wäre ein bisschen spezifischer - entweder die 'IO :: Datei' oder die' Autodie' Perldoc. Autodie sagt, dass es lexikalisch ist, aber dann geht es voran, um zu zeigen, wie man es in Blöcken benutzt. Warnungen sind auch lexikalisch begrenzt, aber ich denke, ich hatte es vorher nicht bemerkt. Danke für deine Antwort. Es macht die Verwendung von "Autodie" etwas weniger nützlich. –

+0

@David W., Was? Nein, Autodie wäre völlig nutzlos, wenn es für Ihren gesamten Dolmetscher ein Alles oder nichts wäre. – ikegami

Antwort

5

autodie ist lexikalisch begrenzt. Daher ändert (umschließt) Sie Anrufe in Ihre Datei auf open, aber nicht innerhalb IO::File.