Ich möchte eine lexikalische Datei-Handle zu einem Unterprogramm übergeben ein benanntes Argument, aber die folgenden nicht kompiliert:Perl: Wie übergeben und verwenden Sie ein lexikalisches Datei-Handle zu einer Subroutine als benanntes Argument?
#!/usr/bin/perl -w
use strict;
my $log_fh;
my $logname = "my.log";
sub primitive {
my ($fh, $m) = @_;
print $fh $m;
}
sub sophisticated {
my ($args) = @_;
print $args->{m};
print $args->{fh} $args->{m} ;
}
open $log_fh, ">", $logname;
print $log_fh "Today I learned ...\n";
primitive($log_fh,"... the old way works ...\n");
sophisticated({
fh=>$log_fh,
m=>"... and the new way requires an intervention by SO.",
});
close $log_fh;
Die Beschwerde ist:
Scalar found where operator expected at ./lexical.file.handle.pl line 15, near
} $args"
(Missing operator before $args?)
$ perl --version
This is perl, v5.10.1
Es funktioniert O. K. Wenn ich die primitive Technik der Übergabe von Argumenten verwende, funktioniert die Named-Argument-Hash-Technik für die Nachricht Teil, nur nicht für die Datei behandeln Teil. Benötige ich eine neue Version von Drucken?
Siehe auch: http://stackoverflow.com/questions/3027605/how-can-i-store-and-access-a- filehandle-in-a-perl-class – mob
Sie sollten sich von der Angewohnheit der Vorerklärung von Variablen (das "my $ log_fh;" ist unnötig), und Sie sollten den Status von öffnet überprüfen. ZB: öffne meine $ log_fh, ">", $ logname oder stirb "Error opening $ logname: $!"; – runrig