Kann ich einen Perl-Konstante im glob-Operator?
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.
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.