2010-06-12 20 views
7

primero mira el siguiente código.¿Cómo puedo almacenar y acceder a Filehandle en una clase de Perl?

#! /usr/bin/perl 
package foo; 

sub new { 

    my $pkg = shift; 
    my $self = {}; 
    my $self->{_fd} = undef; 
    bless $self, $pkg; 

    return $self; 
} 

sub Setfd { 

    my $self = shift; 
    my $fd = shift; 
    $self_->{_fd} = $fd; 
} 

sub write { 

    my $self = shift; 
    print $self->{_fd} "hello word"; 
} 

my $foo = new foo; 

Mi intención es almacenar un identificador de archivo dentro de una clase usando hash. el identificador de archivo no está definido al principio, pero puede iniciarse posteriormente llamando a la función Setfd. luego se puede llamar a escribir para escribir realmente la cadena "hello word" en un archivo indicado por el manejador de archivo, se supone que el manejador de archivo es el resultado de un "write" de éxito abierto.

pero, el compilador perl simplemente se queja de que hay un error de sintaxis en la línea "imprimir". ¿Alguien puede decirme qué sucede aquí? gracias por adelantado.

+4

Algunas notas al margen, utilice cualquiera de estos estilos de nombres para mostrar mejor la separación palabra: '' setFd' o set_fd' o 'SetFd'. Mantenga un estilo de capitalización consistente, ya sea 'write' y' set_fd' o 'Write' y' Set_Fd' (sugiero el primero). También en Perl es un "identificador de archivo" no un "descriptor de archivo", por lo que querría 'set_fh'. Finalmente, active las advertencias ('use warnings' o ponga '-w' en la línea' #! '), Revelará un error en su constructor. – Schwern

+1

Además, 'use strict', ya que habría revelado este error no sintáctico, pero probablemente no lo que significa en esta línea de código' $ self _-> {_ fd} = $ fd; ' –

+0

@ Schwern: gracias por tu consejo. –

Respuesta

14

Usted tendrá que poner la expresión $self->{_fd} en un bloque o asignarlo a una expresión más simple:

print { $self->{_fd} } "hello word"; 

    my $fd = $self->{_fd}; 
    print $fd "hello word"; 

De perldoc -f print:

Tenga en cuenta que si usted está almacenando filehandles en una matriz , o si está utilizando cualquier otra expresión más compleja que una variable escalar para recuperarla, tendrá que usar un bloque que devuelva el valor del identificador de archivo en su lugar:

print { $files[$i] } "stuff\n"; 
print { $OK ? STDOUT : STDERR } "stuff\n"; 
6

alternativa:

use IO::Handle; 

# ... later ... 

$self->{_fd}->print('hello world'); 
Cuestiones relacionadas