Esto se resuelve fácilmente mediante la creación de una variable para un identificador de archivo:
sub _init_tmp_db {
my $self = shift;
my $fh;
open $fh, ">", "data.txt"
$self->{temp_db_fh} = $fh;
# Sometime later...
$fh = $self-{temp_db_hf};
print $fh "Bob\n";
}
Este es un problema porque la forma en que se procesa la sintaxis print
y el descuido temprano de la sintaxis. La declaración print
tiene realmente dos formatos separados: el formato n. ° 1 es que simplemente lo está pasando para imprimir. El formato n. ° 2 dice que el primer elemento puede ser un identificador de archivo y el resto es lo que desea imprimir en el manejador de archivo. Si print
no puede determinar fácilmente que el primer parámetro es un identificador de archivo, falla.
Si observa otros idiomas, usarán un parámetro para pasar el identificador del archivo y tal vez las cosas para imprimir. O en los lenguajes orientados a objetos, van a sobrecargar >>
para el parámetro del identificador de archivo. Se van a ver algo como esto:
print "This is my statement", file=file_handle;
o
print "This is my statement" >> file_handle;
Usted podría ser capaz de munge la sintaxis para alejarse del uso de una variable. Sin embargo, no hace que el programa sea más eficiente o más legible, y puede hacer que el programa sea más difícil de mantener. Entonces, solo usa una variable para el manejador de archivo.
Dijiste clase en su título. Supongo que está interesado en escribir un paquete orientado a objetos totalmente dedicado para hacer esto. Aquí hay un ejemplo rápido. Aviso en el write
subrutina
método Recupero el identificador de archivo en una variable y uso la variable en la instrucción print
.
#! /usr/bin/env perl
#
use strict;
use warnings;
#######################################################
# MAIN PROGRAM
#
my $file = File->new;
$file->open("OUTPUT") or
die "Can't open 'OUTPUT' for writing\n";
$file->write("This is a test");
#
#######################################################
package File;
use Carp;
sub new {
my $class = shift;
my $self = {};
bless $self, $class;
return $self;
}
sub open {
my $self = shift;
my $file = shift;
my $fh;
if (defined $file) {
$self->{FILE} = $file;
open ($fh, ">", $file) and $self->_fh($fh);
}
return $self->_fh;
}
sub _fh {
my $self = shift;
my $fh = shift;
if (defined $fh) {
$self->{FH} = $fh;
}
return $self->{FH};
}
sub write {
my $self = shift;
my $note = shift;
my $fh = $self->_fh;
print $fh $note . "\n";
return
}
Esto no funcionará con 'utilizar estrictas 'referencias';' – dgw
hice buscar muchos lugares, pero nunca tuve esa página. Muchas gracias. –