Pregunta

Estoy analizando archivos XML con algo como:

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

Quiero usar una constante para 'archivos', digamos

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

Espero que entiendas la idea y puedas ayudarme :) ..

Gracias de antemano.

¿Fue útil?

Solución

Hmm, esta es una razón para usar Readonly en lugar de constante. Es posible que pueda usar & el inicio o () al final de la constante para que Perl se dé cuenta de que es una subrutina. Déjame comprobar.

No, pero puedes usar el clásico truco de crear un arrayref para desreferenciar:

#!/usr/bin/perl

use strict;
use warnings;

use constant DIR => "/tmp";

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

Pero como glob "*" es lo mismo que <*> puede preferir:

#!/usr/bin/perl

use strict;
use warnings;

use constant DIR => "/tmp";

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

Probablemente diría

#!/usr/bin/perl

use strict;
use warnings;

use Readonly;

Readonly my $DIR => "/tmp";

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

Otros consejos

Como han dicho otros, esto se trata de interpolación de cadenas.

El pragma constante falla en contextos interpolativos, por lo que debe usar algo que funcione.

Como ya se mencionó, Readonly es una opción.

También puede usar el antiguo " asignar un valor de solo lectura a un truco de 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
}

Seguramente " / " en este contexto se trataría como una división y no es probable que eso vaya a ninguna parte. Creo que es posible que deba retroceder un poco y ver qué otras opciones tiene. Creo que estás tratando de hacer & Quot; file globbing & Quot; y parece recordar el apoyo en perl para eso, aunque no recuerdo los detalles. Hay un & Quot; Glob & Quot; módulo en CPAN que es posible que desee ver. Personalmente, sería mucho más peatonal y solo usaría DirHandle y filtraría archivos que no sean xml con un & "; Siguiente ... a menos que ... &"; línea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top