2010-06-12 14 views
7

Bitte sehen Sie sich zuerst den folgenden Code an.Wie kann ich ein Dateihandle in einer Perl-Klasse speichern und darauf zugreifen?

#! /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; 

Meine Absicht ist es, ein Datei-Handle innerhalb einer Klasse mit Hash zu speichern. Das Datei-Handle ist zunächst nicht definiert, kann aber später durch Aufrufen der Funktion Setfd initialisiert werden. dann kann write aufgerufen werden, um tatsächlich String "hallo word" in eine Datei zu schreiben, die durch das Dateihandle angegeben wird, vorausgesetzt, dass das Dateihandle das Ergebnis eines erfolgreichen "write" -Öffners ist.

aber, beschwert sich Perl-Compiler gerade, dass es Syntaxfehler in der Zeile "print" gibt. Kann mir irgendjemand von mir sagen, was hier nicht stimmt? Danke im Voraus.

+4

Einige Nebennoten, verwenden Sie eine dieser Namensgebung Stile besser zu zeigen Worttrennung: 'setFd' oder' set_fd' oder 'SetFd'. Behalten Sie einen konsistenten Großbuchstabenstil, entweder 'write' und' set_fd' oder 'Write' und' Set_Fd' (ich schlage den ersten vor). Auch in Perl ist es ein "Datei-Handle", kein "Datei-Deskriptor", also würdest du 'set_fh' wollen. Aktivieren Sie schließlich Warnungen (entweder 'Warnungen verwenden 'oder setzen Sie ein' -w' in der '#!' Zeile), es wird ein Fehler in Ihrem Konstruktor angezeigt. – Schwern

+1

Zusätzlich wird 'use strict' verwendet, da dieser nicht-syntaktische aber wahrscheinlich-nicht-was-du-meinen-Fehler in dieser Codezeile' $ self _-> {_ fd} = $ fd; ' –

+0

@ offenbart hätte. SCHWERN: Danke für deinen Rat. –

Antwort

14

Sie den $self->{_fd} Ausdruck in einem Block setzen müssen oder es zu einem einfacheren Ausdruck zuweisen:

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

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

Von perldoc -f print:

Beachten Sie, dass, wenn Sie Dateihandies in einem Array sind Speicher oder wenn Sie einen anderen Ausdruck verwenden, der komplexer als eine Skalarvariable ist, um ihn abzurufen, müssen Sie stattdessen einen Block verwenden, der den Wert des Dateihandles zurückgibt:

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

Alternativ:

use IO::Handle; 

# ... later ... 

$self->{_fd}->print('hello world'); 
Verwandte Themen