Frage

Ich bin Parsen von XML-Dateien mit so etwas wie:

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

Ich möchte eine Konstante verwenden, um ‚Dateien‘, sagen

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

Ich hoffe, dass Sie die Idee zu verstehen, und kann mir helfen:) ..

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Hmm, das ist ein Grund, Read-only statt konstant. Sie können in der Lage sein, den Start oder & am Ende der Konstanten zu verwenden () Perl kennen zu erkennen, dass es Unterprogramm ist. Lassen Sie mich überprüfen.

Nein, aber Sie den klassischen Trick der Schaffung eines ArrayRef zu dereferenzieren verwenden können:

#!/usr/bin/perl

use strict;
use warnings;

use constant DIR => "/tmp";

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

Aber da glob "*" ist die gleiche wie <*> Sie bevorzugen:

#!/usr/bin/perl

use strict;
use warnings;

use constant DIR => "/tmp";

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

Ich würde wahrscheinlich sagen,

#!/usr/bin/perl

use strict;
use warnings;

use Readonly;

Readonly my $DIR => "/tmp";

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

Andere Tipps

Wie andere gesagt haben, ist dies alles über String-Interpolation.

Die Konstante Pragma nicht in Interpolations-Kontexten, so dass Sie etwas verwenden, die funktionieren wird.

Wie bereits erwähnt, ist Read-only eine Option.

Sie können auch die alten verwenden „zuweisen einen schreibgeschützten Wert auf einen Typeglob Trick“.

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
}

Sicher „/“ würde in diesem Zusammenhang als Abteilung behandelt werden, und das ist wahrscheinlich nicht überall gehen. Ich glaube, Sie müssen möglicherweise ein wenig Schritt zurück und schauen Sie, was andere Optionen, die Sie haben. Ich denke, dass Sie versuchen, „Datei Globbing“ zu tun und ich scheinen, dass die Unterstützung in Perl zu erinnern, obwohl ich die Einzelheiten nicht erinnern. Es gibt eine „Glob“ Modul in CPAN, die Sie möchten, zu betrachten. Persönlich würde ich viel mehr Fußgänger sein und nur DIRHANDLE verwenden und auszufiltern Nicht-XML-Dateien mit einem „weiter ... es sei denn ...“ Zeile.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top