Posso saltare un intero file con < > operatore?
-
07-07-2019 - |
Domanda
Il seguente codice Perl presenta un'evidente inefficienza;
while (<>)
{
if ($ARGV =~ /\d+\.\d+\.\d+/) {next;}
... or do something useful
}
Il codice passerà attraverso ogni riga del file che non vogliamo.
Sulla dimensione dei file su cui è in esecuzione questo particolare script, è improbabile che faccia una differenza notevole, ma per motivi di apprendimento; Come posso spazzare l'intero file < > sta funzionando e passare al prossimo?
Lo scopo di questo è perché il server che esegue questo script memorizza vecchie versioni di app con il numero di versione nel nome del file, sono interessato solo alla versione corrente.
Soluzione
grep ARGV prima.
@ARGV = grep { grep ARGV prima.
<*> !~ /\d+\.\d+\.\d+/ } @ARGV;
while (<>)
{
# do something with the other files
}
Altri suggerimenti
La soluzione di Paul Roub è la soluzione migliore se puoi filtrare @ARGV
prima di iniziare a leggere qualsiasi file.
Se devi saltare un file dopo aver iniziato a iterarlo,
while (<>) {
if (/# Skip the rest of this file/) {
close ARGV;
next;
}
print "$ARGV: La soluzione di Paul Roub è la soluzione migliore se puoi filtrare @ARGV
prima di iniziare a leggere qualsiasi file.
Se devi saltare un file dopo aver iniziato a iterarlo,
<*>";
}
risposta di Paul Roub funziona per ulteriori informazioni, vedere La sezione operatori IO della pagina man di perlop . Viene menzionato lo schema di utilizzo di grep e alcune altre cose relative a < > ;.
Prendi nota della menzione di ARGV: : sola lettura per quanto riguarda cose come:
perl dangerous.pl 'rm -rfv *|'