Pergunta

Eu sou analisar arquivos XML com algo como:

while (<files/*.xml>) { ... }

Eu quero usar uma constante para 'arquivos', digamos

use constant FILES_PATH => 'files';
while (<FILES_PATH/*.xml>) { ... }

Espero que você entenda a idéia, e pode me ajudar:) ..

Agradecemos antecipadamente.

Foi útil?

Solução

Hmm, esta é uma razão para usar Readonly em vez de constante. Você pode ser capaz de usar & o início ou () no final da constante para obter Perl para perceber que é sub-rotina. Deixe-me verificar.

Não, mas você pode usar o truque clássico de criar um ARRAYREF excluir a referência:

#!/usr/bin/perl

use strict;
use warnings;

use constant DIR => "/tmp";

print map { "$_\n" } <${[DIR]}[0]/*>;

Mas desde glob "*" é o mesmo que <*> você pode preferir:

#!/usr/bin/perl

use strict;
use warnings;

use constant DIR => "/tmp";

print map { "$_\n" } glob DIR . "/*";

Eu provavelmente diria

#!/usr/bin/perl

use strict;
use warnings;

use Readonly;

Readonly my $DIR => "/tmp";

print map { "$_\n" } <$DIR/*>;

Outras dicas

Como já foi dito, isso é tudo sobre a interpolação string.

O pragma constante falha em contextos interpolativos, então você tem que usar algo que vai funcionar.

Como já mencionado, só de leitura é uma opção.

Você também pode usar o velho "atribuir um valor de somente leitura a um truque typeglob".

our $FILES_PATH; # declare FILES_PATH scalar to keep strict happy.
*FILES_PATH = \'files';  # Assign to typeglob so $FILES_PATH points to a string literal  

while( <$FILES_PATH/*.xml> ) {
    # read the files
}

Com certeza "/" neste contexto seria tratado como divisão e que não é susceptível de ir a qualquer lugar. Eu acho que você pode precisar recuar um pouco e olhar para o que outras opções que você tem. Eu acho que você está tentando fazer "arquivo globbing" e parece-me apoio recordação em perl para que, embora eu não me lembro os detalhes. Existe um módulo "Glob" no CPAN que você pode querer olhar. Pessoalmente, eu seria muito mais pedestres e usar apenas DirHandle e filtrar arquivos não-XML com um "próximo ... a menos que ..." linha.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top