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?
Mein Verständnis ist, dass "Autodie" lexikalisch ist. Daher ändert es die Aufrufe von 'open' in Ihrer Datei, aber nicht in IO :: File. – tjd
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. –
@David W., Was? Nein, Autodie wäre völlig nutzlos, wenn es für Ihren gesamten Dolmetscher ein Alles oder nichts wäre. – ikegami