Wie Baue ich Perl reguläre Ausdrücke dynamisch?
Habe ich ein Perl-Skript, dass die Traversen eine Verzeichnis-Hierarchie mithilfe von File::Next::Dateien. Es wird nur die Rückkehr zu den Skript-Dateien, die Ende in ".avi", ".flv", ".mp3", ".mp4" und ".wmv." Es wird auch überspringen Sie den folgenden Unterordner: ".svn" und alle Unterverzeichnisse, die in endet ".frames." Dies ist angegeben in der file_filter
und descend_filter
Unterprogramme unten.
my $iter = File::Next::files(
{ file_filter => \&file_filter, descend_filter => \&descend_filter },
$directory );
sub file_filter {
# Called from File::Next:files.
# Only select video files that end with the following extensions.
/.(avi|flv|mp3|mp4|wmv)$/
}
sub descend_filter {
# Called from File::Next:files.
# Skip subfolders that either end in ".frames" or are named the following:
$File::Next::dir !~ /.frames$|^.svn$/
}
Was ich tun wollen ist, die erlaubten Dateitypen und-nicht zulässig unter-Verzeichnis-Namen in einer Konfigurationsdatei, so dass Sie kann aktualisiert werden on the fly.
Was ich wissen will ist, wie kann ich den code der Unterprogramme zu bauen regex-Konstrukte basierend auf den Parametern in der Konfigurationsdatei?
/.(avi|flv|mp3|mp4|wmv)$/
$File::Next::dir !~ /.frames$|^.svn$/
- Kann dir nicht helfen mit deiner Frage, aber das Paket, das Sie mit sieht genial aus. Ich Tat das gleiche mit plain old File::Find und es wurde viel messier. Ich werde versuchen Sie diese. Danke! +1
- Checkout: search.cpan.org/dist/File-Next
- p3rl.org/File::Find::Rule möglicherweise besser für Sie, je nach situation.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vorausgesetzt, Sie haben die Konfigurationsdatei analysiert, um eine Liste der Erweiterungen und ignoriert Verzeichnisse, die Sie bauen können, die den regulären Ausdruck als string und verwenden dann die
qr
Betreiber kompilieren Sie es in einem regulären Ausdruck:Die Zusammenstellung ist nicht unbedingt erforderlich; Sie können die string-Muster direkt:
Verzeichnisse sind ein wenig schwieriger, weil Sie zwei verschiedene Situationen: vollständige Namen und Suffixe. Die Konfigurationsdatei wird die Verwendung der verschiedenen Tasten klar zu machen, was was ist. z.B. "Ordnername" und "dir_suffix." Für den kompletten Namen würde ich nur bauen Sie ein hash:
Nachgestellten Verzeichnissen getan werden kann, die gleiche Weise, wie Datei-Erweiterungen:
Könnte man sogar bauen, die Muster in anonyme Subroutinen zu vermeiden, verweisen auf Globale Variablen:
Können sagen, dass Sie verwenden Config::General für Sie die config-Datei und enthält diese Zeilen:
Könnte man dann verwenden Sie es wie so (siehe Config::General, für mehr):
(Das ist komplett ungetestet.)
qr//
. Sie können nur dazu: my $regex_builder = join '|', @ - Erweiterungen; my $regex = qr/\.($regex_builder)$/;Bauen Sie es wie einen normalen string und dann mit interpolation am Ende schalten Sie es in einen regex kompiliert. Auch vorsichtig sein, Sie nicht entkommen . oder setzen Sie in eine Zeichenklasse, so dass es bedeutet, dass alle Zeichen (anstatt einer wörtlichen Zeit).
Seine einigermaßen geradlinig mit File::Find::Rule, nur ein Fall, der die Liste erstellen, bevor die hand.
Dann seine einfach ein Fall von dem füllen der arrays. ( Hinweis: der obige code auch ungetestet, aber wahrscheinlich arbeiten ). Ich würde in der Regel verwenden YAML für diese, es macht das Leben leichter.
Hinweis Mit dem handlichen Modul 'alias.pm " die Importe "File::Find::Rule" für mich als "Regel".
Wenn Sie bauen wollen, eine potenziell große regexp und nicht die Mühe machen möchten Debuggen Sie die Klammern, verwenden Sie ein Perl-Modul, um es für Sie zu bauen!
Obwohl File::Find::Rule bereits Möglichkeiten zum Umgang mit diesem, in ähnlichen Fällen, die Sie nicht wirklich wollen, eine regex. Die regex nicht kaufen Sie viel hier, weil du suchst eine Feste Folge von Zeichen, die an das Ende jedes Dateinamens. Sie wollen wissen, ob das Feste Reihenfolge wird in einer Liste von Sequenzen, die Sie interessieren. Store alle Erweiterungen in einem hash und suchen Sie in diesem hash:
Brauchen Sie nicht zu bauen, bis Sie einen regulären Ausdruck, und Sie brauchen nicht zu gehen durch mehrere mögliche regex-Wechsel zu prüfen, jede Erweiterung, die Sie haben zu prüfen.