Ich habe ein Perl-Skript, das eine Verzeichnishierarchie mit File :: Next :: files durchläuft. Es wird nur zu den Skriptdateien zurückkehren, die auf ".avi", ".flv", ".mp3", ".mp4" und ".wmv" enden. Außerdem werden die folgenden Unterverzeichnisse übersprungen: ".svn" und jedes Unterverzeichnis, das auf ".frames" endet. Dies wird in den Unterroutinen %code% und %code% unten angegeben.
%Vor%Ich möchte die erlaubten Dateierweiterungen und nicht erlaubten Unterverzeichnisnamen in einer Konfigurationsdatei platzieren, damit sie im laufenden Betrieb aktualisiert werden können.
Was ich wissen möchte ist, wie ich die Subroutinen zum Erstellen von Regex-Konstrukten basierend auf den Parametern in der Konfigurationsdatei codiere?
%Vor%Es ist ziemlich einfach mit File :: Find :: Rule, nur ein Fall der Erstellung der Liste vor Hand.
%Vor%Dann ist es nur ein Fall, diese Arrays zu füllen. (Hinweis: Der obige Code ist ebenfalls nicht getestet, wird aber wahrscheinlich funktionieren). Normalerweise benutze ich dafür YAML, das macht das Leben einfacher.
%Vor%Hinweis Verwenden Sie das praktische Modul 'aliased.pm', das "File :: Find :: Rule" für mich als "Rule" importiert.
Wenn Sie eine potentiell große Regexp erstellen möchten und Sie nicht wollen, die Klammern zu debuggen, verwenden Sie ein Perl-Modul, um es für Sie zu erstellen!
%Vor%Obwohl File :: Find :: Rule bereits Möglichkeiten hat, sich damit zu befassen, möchten Sie in ähnlichen Fällen nicht wirklich eine Regex. Die Regex kauft dir hier nicht viel, weil du am Ende jedes Dateinamens nach einer festen Zeichenfolge suchst. Sie möchten wissen, ob sich diese feste Sequenz in einer Liste von Sequenzen befindet, die Sie interessieren. Speichern Sie alle Erweiterungen in einem Hash und suchen Sie in diesem Hash:
%Vor%Sie müssen keinen regulären Ausdruck erstellen, und Sie müssen nicht mehrere mögliche Regex-Änderungen durchgehen, um jede Erweiterung zu überprüfen, die Sie untersuchen müssen.
Erstellen Sie es wie eine normale Zeichenfolge und verwenden Sie dann am Ende die Interpolation, um es in eine kompilierte Regex umzuwandeln. Sei auch vorsichtig, du entkommst nicht. oder es in eine Zeichenklasse einfügen, also jedes Zeichen (statt einer buchstäblichen Periode).
%Vor%Wenn Sie davon ausgehen, dass Sie die Konfigurationsdatei analysiert haben, um eine Liste von Erweiterungen und ignorierten Verzeichnissen zu erhalten, können Sie den regulären Ausdruck als Zeichenfolge erstellen und dann mit dem Operator %code% in einen regulären Ausdruck kompilieren:
%Vor%Die Zusammenstellung ist nicht unbedingt notwendig; Sie können das Zeichenfolgenmuster direkt verwenden:
%Vor%Verzeichnisse sind ein wenig schwieriger, weil Sie zwei verschiedene Situationen haben: vollständige Namen und Suffixe. Ihre Konfigurationsdatei muss verschiedene Schlüssel verwenden, um deutlich zu machen, welches was ist. z.B. "dir_name" und "dir_suffix" Für vollständige Namen würde ich nur einen Hash erstellen:
%Vor%Suffixed Verzeichnisse können wie Dateierweiterungen erfolgen:
%Vor%Sie könnten die Muster sogar in anonyme Unterprogramme einbauen, um zu vermeiden, dass globale Variablen referenziert werden:
%Vor%Sagen wir, dass Sie Config :: General für Ihre Konfigurationsdatei verwenden und diese Zeilen enthält :
%Vor%Sie könnten es dann so verwenden (siehe Config :: General für mehr):
%Vor%(Dies ist vollständig nicht getestet.)