Pergunta

O código Perl a seguir tem uma ineficiência óbvia;

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

O código passará por todas as linhas do arquivo que não queremos.

No tamanho dos arquivos, é improvável que esse script específico seja executado, faça uma diferença perceptível, mas por uma questão de aprendizado; Como posso eliminar o arquivo inteiro <> está funcionando e mudar para o próximo?

O objetivo disso ocorre porque o sever esse script é executado nas versões antigas de lojas de aplicativos com o número da versão no nome do arquivo, estou interessado apenas na versão atual.

Foi útil?

Solução

Grep argv primeiro.

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

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

Outras dicas

A solução de Paul Roub é melhor se você pode filtrar @ARGV Antes de começar a ler qualquer arquivo.

Se você tiver que pular um arquivo depois de começar a itera,

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

Paul Roub's responda funciona para mais informações, consulte A seção de operadores de IO da página de Perlop Man. O padrão de uso de Grep é mencionado, bem como algumas outras coisas relacionadas a <>.

Tomar nota da menção de Argv :: readonly sobre coisas como:

perl dangerous.pl 'rm -rfv *|'
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top