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.

È stato utile?

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 *|'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top