Posso usar uma constante Perl no operador glob?
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.
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.