2009-09-14 10 views
8

Aşağıdaki Perl kodu bariz verimsizliği vardır;Tüm dosyayı <> operatörüyle atlayabilir miyim?

while (<>) 
{ 
if ($ARGV =~ /\d+\.\d+\.\d+/) {next;} 
... or do something useful 
} 

Kod, istemediğimiz dosyanın her satırından geçer. Bu özel komut dosyası bu çalışıyorsa dosyaların boyutuna günü

ama öğrenme uğruna, farkedilir bir fark yaratmak için olası değildir; <> dosyasının tamamını nasıl çöp kutusuna atabilirim ve diğerine nasıl geçebilirim? sever bu komut dosya adında sürüm numarası ile uygulamalar mağazalar eski sürümlerinde çalıştığı için

bu amacı, ben geçerli sürümünde ilgileniyorum. İlk

cevap

15

grep ARGV. Daha fazla bilgi için

@ARGV = grep { $_ !~ /\d+\.\d+\.\d+/ } @ARGV; 

while (<>) 
{ 
    # do something with the other files 
} 
+0

IC, sadece herhangi bir diğer liste yazar gibi @ARGV filtre. İlgili bağlantılar için –

19

Paul Sorun çözümüyle en iyisidir.

Eğer bunu yineleme başladıktan sonra bir dosyayı atlamak varsa

,

while (<>) { 
    if (/# Skip the rest of this file/) { 
     close ARGV; 
     next; 
    } 
    print "$ARGV: $_"; 
} 
+0

Eğer yapabilirsem bu cevabı kabul ederdim. –

+0

+ 1 Ayrıca 'perl -pe' /' perl -ne' için çalışır. –

+0

Bunu beğendim. Kolayca anahtar kelimeye göre bir dizindeki dosyaları arama yapabilirsiniz Bu şekilde: 'perl -E '@ ARGV = <"*">; while (<>) {if (/ searchedWord /) {$ ARGV deyin; yakın ARGV;}} '' – eli