2010-10-29 15 views
7

perldoc perlvar'de şunu okudum:Özel ARGV tanıtıcısından okumak için bir dosya alan Perl işlevine nasıl söyleyebilirim?

Şu anda "ARGV" nin sadece "<>" operatörü içindeki büyülü etkisine sahip olduğunu unutmayın; başka bir yerde, sadece dosyası tarafından açılan dosyasına karşılık gelen bir dosyasıdır. Özellikle parametresi olarak bir parametresine parametre olarak parametresinin değerini işleviyle değiştirmemesi, dosyasının içeriğini otomatik olarak @ARGV dosyasında okuyacaktır.

nasıl *ARGV (veya buna benzeyen bir şey) bir dosya işleyişini bekleyen bir işleve paramter olarak geçebilir ve bu işlevi @ARGV'daki tüm dosyaları okuyabiliyorum?

cevap

12

Hemen devam edin ve referansı olan *ARGV tipglob veya \*ARGV numarasına geçin. Sadece sonuç olarak faydalanan işlevin, temel işlevsel eşdeğeri olan <$fh> operatörüyle veya readline($fh) aracılığıyla yapıldığından emin olun.

konu sadece almak mümkün olmayacaktır hatırlatmak için çalışıyor perlvar manpage alıntıladığınız pasajda ele ARGV 'ın sihirli açık üzerinde readline daha eğer herhangi bir kullanım diğer okuma mekanizmasını tetikleyecek read, sysread veya getc gibi Bu çalıştığını kendinize kanıtlamak için

Run:

sub mycat { 
    my $fh = shift; 
    print "$ARGV $.: $_" while <$fh>; 
} 
mycat(*ARGV); 

bir dosyaya koy, sonra da birkaç dosya argümanlarla çalıştırın:

% perl mycat ./mycat //`pwd`/mycat ~/mycat 
./mycat 1: sub mycat { 
./mycat 2:  my $fh = shift; 
./mycat 3:  print "$ARGV $.: $_" while <$fh>; 
./mycat 4: } 
./mycat 5: mycat(*ARGV); 
///home/tchrist/mycat 6: sub mycat { 
///home/tchrist/mycat 7:  my $fh = shift; 
///home/tchrist/mycat 8:  print "$ARGV $.: $_" while <$fh>; 
///home/tchrist/mycat 9: } 
///home/tchrist/mycat 10: mycat(*ARGV); 
/home/tchrist/mycat 11: sub mycat { 
/home/tchrist/mycat 12:  my $fh = shift; 
/home/tchrist/mycat 13:  print "$ARGV $.: $_" while <$fh>; 
/home/tchrist/mycat 14: } 
/home/tchrist/mycat 15: mycat(*ARGV); 

görüyor musunuz? İyi çalışıyor.

+1

Huh. Programım bunu okuduktan sonra çalışmaya başladı. –

-1

Sahte (bir Unix sistemi üzerinde) cat

open FAKE_ARGV, "cat @ARGV |"; 
function_expecting_filehandle(*FAKE_ARGV); 
... 

ile bu belgeyle büyü ($ARGV, $.) bazı kaybedebilir.

Ayrıca, bağlı bir dosya tanıtıcısı ile bir yolun olduğundan eminim (bkz. perltie). aşırı yüklenmiş bir nesneyi ilerlerken

1

Sen <> için yeniden gönderdiğinizde edebilirsiniz:

{package ReadARGV; 
    sub new {bless []} 
    use overload '<>' => sub {<>}; 
} 

sub reader { 
    my $fh = shift; 
    local $_; 
    print while <$fh>; 
} 

reader(ReadARGV->new); 

ReadARGV paket basit nesne yapıcı new içerir ve daha sonra basitçe <> aramaya <HANDLE> operatörü yüklenmesine yol açıyor.