2010-06-12 14 views
7

Lütfen önce aşağıdaki koda bakın.Perl sınıfında bir dosya kitaplığını nasıl kaydedebilir ve bunlara erişebilirim?

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

Amacım, bir sınıfa hash kullanarak bir dosya tanıtıcısı depolamaktır. dosya tanıtıcısı ilk başta tanımlanmamıştır, ancak Setfd işlevini çağırarak sonradan başlatılabilir. yazımı, dosya tanıtıcısının "başarılı" bir açıklamanın sonucu olduğu varsayıldığından, dosya tanıtıcısı tarafından gösterilen bir dosyaya "merhaba sözcük" dizesini yazmak için çağrılabilir.

Ancak, perl derleyicisi, "yazdırma" satırında sözdizimi hatası olduğunu bildirir. Biriniz bana burada neyin yanlış olduğunu söyleyebilir mi? şimdiden teşekkürler.

+4

bazı yan notları, daha iyi göstermek kelime ayrılması için bu adlandırma stilleri herhangi kullanımı: 'setFd' ya da 'set_fd' ya da' SetFd'. Tutarlı bir büyük harf kullanmaya devam edin, 'write' ve 'set_fd' ya da' Write' ve 'Set_Fd' (eskileri öneririm). Ayrıca Perl'de bir "dosya tanıtıcısı" değil "dosya tanıtıcı" değil, yani set_fh 'yi istersiniz. Son olarak, uyarıları açın ('uyarıları kullan' veya '#' satırına '-w' yazın) yapıcınızdaki bir hatayı ortaya çıkarır. – Schwern

+1

Ayrıca, 'use use ', bu sözdizimsel olmayan-fakat-muhtemelen-ne demek istemediğinizi bu hata satırında ortaya çıkardığı gibi' $ self _-> {_ fd} = $ fd; ' –

+0

@ Schwern: tavsiyen için teşekkürler. –

cevap

14

Bir blokta $self->{_fd} ifadesini koymak veya daha basit bir ifade atamak gerekir:

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

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

perldoc -f print Gönderen:

Not olduğunu Bir dizide bir filehandles depolamak eğer veya almak için bir skaler değişkenden daha karmaşık başka bir ifade kullanıyorsanız, bunun yerine filehandle değerini döndüren bir blok kullanmanız gerekir:

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

:

use IO::Handle; 

# ... later ... 

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