___ qstntxt ___

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%     
___ answer902884 ___

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.

___ answer904558 ___

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%     
___ answer910597 ___

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.

    
___ answer899161 ___

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%     
___ tag123regex ___ Reguläre Ausdrücke stellen eine deklarative Sprache zur Verfügung, um Muster in Strings zu vergleichen. Sie werden häufig für die Überprüfung, Analyse und Umwandlung von Zeichenfolgen verwendet. Da reguläre Ausdrücke nicht vollständig standardisiert sind, sollten alle Fragen mit diesem Tag auch ein Tag enthalten, das die anwendbare Programmiersprache oder das entsprechende Werkzeug angibt. HINWEIS: Nach HTML-, JSON-, usw.-Regexen zu fragen, neigt zu negativen Reaktionen. Wenn es einen Parser dafür gibt, verwende stattdessen diesen. ___ tag123perl ___ Perl ist eine prozedurale, allgemeine Programmiersprache für allgemeine Zwecke, die für ihre native Unterstützung von regulären Ausdrücken und String-Parsing-Funktionen bekannt ist. Bitte verwenden Sie diesen Tag für Fragen zu Perl im Allgemeinen. Für Dinge, die mit der neuen (aber verwandten) Sprache "Perl 6" zu tun haben, verwenden Sie bitte das perl6-Tag. Verwenden Sie für reguläre Ausdrücke nach Perl-Art in anderen Sprachen das Regex-Tag oder, falls sie auf der PCRE-Bibliothek basieren, das PCRE-Tag. ___ tag123configuration ___ Konfiguration ist die Festlegung der Einstellungen für ein System oder eine Anwendung ___ answer898675 ___

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%     
___ answer899051 ___

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.)

    
___

8

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 file_filter und descend_filter 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%     
Dr. Faust 22.05.2009, 15:55
quelle

6 Antworten

24

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 qr 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%     
Michael Carman 22.05.2009 16:11
quelle
3

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.)

    
Anon 22.05.2009 17:39
quelle
3

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%     
Chas. Owens 22.05.2009 18:01
quelle
1

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.

Kent Fredric 24.05.2009 01:48
quelle
1

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%     
dland 24.05.2009 20:12
quelle
0

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.

    
brian d foy 26.05.2009 13:11
quelle

Tags und Links