Posso pular um arquivo inteiro com o operador <>?
-
07-07-2019 - |
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.
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 *|'