Quiero pasar un identificador de archivo léxica a una subrutina utilizando un argumento con nombre, pero el siguiente no se compila:Perl: ¿Cómo pasar y usar un manejador de archivo léxico a una subrutina como argumento con nombre?
#!/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;
La queja es:
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
¡sí funciona cuando uso la técnica primitiva de pasar argumentos, y la técnica de hash de argumento con nombre funciona para la parte del mensaje , simplemente no para el parte del archivo. ¿Necesito una nueva versión de print?
Ver también: http://stackoverflow.com/questions/3027605/how-can-i-store-and-access-a- filehandle-in-a-perl-class – mob
Debe dejar el hábito de predefinir variables (el "my $ log_fh;" es innecesario), y debe verificar el estado de las aperturas. P. ej .: abrir mi $ log_fh, ">", $ logname o morir "Error al abrir $ logname: $!"; – runrig