2010-06-12 4 views
7

proszę najpierw zapoznać się z następującym kodem.Jak mogę przechowywać i otwierać uchwyt pliku w klasie Perla?

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

Moim zamiarem jest przechowywanie uchwytu pliku w klasie przy użyciu skrótu. uchwyt pliku jest początkowo niezdefiniowany, ale można go później zainicjować, wywołując funkcję Setfd. następnie write można wywołać, aby faktycznie napisać ciąg "hello word" do pliku wskazanego przez uchwyt pliku, zakładając, że uchwyt pliku jest wynikiem sukcesu "write" open.

, ale kompilator perl po prostu narzeka, że ​​w linii "print" wystąpił błąd składniowy. Czy ktokolwiek z was może mi powiedzieć, co jest nie tak? z góry dziękuję.

+4

Kilka uwag niepożądane, należy użyć dowolnej z tych stylów nazewnictwa, aby lepiej pokazać słowo separacji: 'setFd' lub' set_fd' lub 'SetFd'. Zachowaj spójny styl wielkich liter - "write" i "set_fd" lub "Write" i "Set_Fd" (sugeruję ten pierwszy). Również w Perlu jest to "uchwyt pliku", a nie "deskryptor pliku", więc chcesz 'set_fh'. Na koniec włącz ostrzeżenia ("używaj ostrzeżeń" lub wstaw '-w' w linii' #! '), Które ujawnią błąd w twoim konstruktorze. – Schwern

+1

Dodatkowo, 'użyj ścisłego', ponieważ ujawniłoby to ten nie-syntaktyczny-ale-prawdopodobnie-nie-jaki-masz-słowny błąd w tym wierszu kodu' $ self _-> {_ fd} = $ fd; ' –

+0

@ Schwern: dzięki za twoją radę. –

Odpowiedz

14

Trzeba będzie umieścić wyraz $self->{_fd} w bloku lub przypisać go do prostszych wyrażenia:

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

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

Od perldoc -f print:

pamiętać, że jeśli jesteś przechowywania uchwytów plików w tablicy lub jeśli używasz innego wyrażenia bardziej złożonego niż zmienna skalarna, aby go pobrać, będziesz musiał użyć bloku zwracającego wartość uchwytu pliku zamiast:

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

Alternatywnie:

use IO::Handle; 

# ... later ... 

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