2009-09-14 16 views
8

Następujący kod Perla ma oczywistą nieefektywność;Czy mogę pominąć cały plik za pomocą operatora <>?

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

Kod wykona każdy wiersz pliku, którego nie chcemy.

Jeśli chodzi o rozmiar plików, na których uruchamiany jest dany skrypt, jest mało prawdopodobne, aby wprowadził zauważalną różnicę, ale ze względu na proces uczenia się; Jak mogę zapisać cały plik <> i przejść do następnego?

Ma to na celu, ponieważ serwer, na którym działa ten skrypt, przechowuje stare wersje aplikacji z numerem wersji w nazwie pliku, interesuje mnie tylko aktualna wersja.

Odpowiedz

15

najpierw grep ARGV.

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

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

IC, po prostu filtrować @ARGV jak każdy inny list. –

19

rozwiązania Pawła Roub jest najlepiej, jeśli można filtrować @ARGV zanim zaczniesz czytać żadnych plików.

Jeśli trzeba pominąć plik po tym, jak zaczęła iteracja go

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

Ja też bym zaakceptował tę odpowiedź, gdybym mógł. –

+0

+ 1 Działa również dla 'perl -pe' /' perl -ne'. –

+0

Podoba mi się to. W ten sposób można łatwo wyszukiwać pliki w katalogu według słów kluczowych: 'perl -E '@ ARGV = <"*">; while (<>) {if (/ searchingWord /) {say $ ARGV; zamknij ARGV;}} "' – eli

Powiązane problemy