Warum funktioniert mein Perl-Einzeiler nicht unter Windows?

8

Von der Windows-Eingabeaufforderung erzeuge ich eine Textdatei aller Dateien in einem Verzeichnis:

%Vor%

Ausgabe:

%Vor%

Ich muss die Datei "config.txt" an eine andere ausführbare Datei füttern, aber bevor ich das tue, muss ich die Datei ändern, um zusätzliche Informationen hinzuzufügen, die die ausführbare Datei benötigt. Also benutze ich den folgenden Befehl:

%Vor%

Ich erwarte das Ergebnis:

%Vor%

Die Datei "config.txt" wird jedoch nicht geändert. Mit der Option "-w" erhalte ich die Warnmeldung:

  

Unbrauchbare Verwendung einer Konstante im leeren Kontext bei -e Zeile 1.

Was mache ich falsch?

    
gatorfax 19.03.2009, 00:30
quelle

3 Antworten

29

Windows cmd.exe verwendet ' nicht als Trennzeichen, nur " . Was Sie tun, entspricht:

%Vor%

So beschwert sich -w "Du hast mir eine Zeichenfolge gegeben, aber das tut nichts".

Die Lösung besteht darin, stattdessen doppelte Anführungszeichen zu verwenden:

%Vor%

oder um sie einfach wegzulassen, da es in diesem Befehl keine Metazeichen gibt, die von cmd.exe interpretiert würden.

Nachtrag

cmd.exe ist nur ein wirklich beschwerliches Biest, für jeden, der an sh -artige Granaten gewöhnt ist. Im Folgenden finden Sie einige weitere häufig auftretende Fehler und Problemumgehungen in Bezug auf perl Aufruf.

%Vor%     
ephemient 19.03.2009, 01:04
quelle
4
___ qstntxt ___

Von der Windows-Eingabeaufforderung erzeuge ich eine Textdatei aller Dateien in einem Verzeichnis:

%Vor%

Ausgabe:

%Vor%

Ich muss die Datei "config.txt" an eine andere ausführbare Datei füttern, aber bevor ich das tue, muss ich die Datei ändern, um zusätzliche Informationen hinzuzufügen, die die ausführbare Datei benötigt. Also benutze ich den folgenden Befehl:

%Vor%

Ich erwarte das Ergebnis:

%Vor%

Die Datei "config.txt" wird jedoch nicht geändert. Mit der Option "-w" erhalte ich die Warnmeldung:

  

Unbrauchbare Verwendung einer Konstante im leeren Kontext bei -e Zeile 1.

Was mache ich falsch?

    
___ tag123windows ___ ALLGEMEINER WINDOWS-SUPPORT IST OFF-TOPIC. Support-Fragen können unter https://superuser.com gestellt werden. Windows ist ein von Microsoft entwickeltes Betriebssystem. Verwenden Sie dieses Tag nur, wenn sich Ihre Frage auf die Verwendung von Windows-APIs oder Windows-spezifischem Verhalten in Bezug auf Ihren Code bezieht, nicht nur, weil Sie Ihren Code unter Windows ausführen. ___ answer660680 ___

Das Perl-Skript funktioniert von einer Linux-Shell. Vielleicht entkommst du etwas nicht richtig.

    
___ answer660720 ___

Windows cmd.exe verwendet %code% nicht als Trennzeichen, nur %code% . Was Sie tun, entspricht:

%Vor%

So beschwert sich %code% "Du hast mir eine Zeichenfolge gegeben, aber das tut nichts".

Die Lösung besteht darin, stattdessen doppelte Anführungszeichen zu verwenden:

%Vor%

oder um sie einfach wegzulassen, da es in diesem Befehl keine Metazeichen gibt, die von %code% interpretiert würden.

Nachtrag

%code% ist nur ein wirklich beschwerliches Biest, für jeden, der an %code% -artige Granaten gewöhnt ist. Im Folgenden finden Sie einige weitere häufig auftretende Fehler und Problemumgehungen in Bezug auf %code% Aufruf.

%Vor%     
___ 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. ___ antwort664549 ___

Die Antwort von ephemient fasst das Problem gut zusammen, aber Sie haben noch eine andere Möglichkeit: Ändern Sie Ihre Shell von %code% zu einer besseren Hülle. Wenn Sie eine Unix-Person sind, würde ich vorschlagen, Cygwin nachzuschlagen, die die Art von Umgebung bietet, die Sie gewohnt sind (zum Beispiel < a href="http://en.wikipedia.org/wiki/Bash_%28Unix_shell%29"> Bash und GNU-Hilfsprogramme).

Wenn Sie eine Windows-Person sind, würde ich vorschlagen, PowerShell ( geb. MSH geb. Monad). In der Tat würde ich vorschlagen, in PowerShell zu suchen, selbst wenn Sie eine Unix-Person sind. Es integriert sich in .NET und hat viele nette Features (wie Objekte, die durch Pipes statt einfacher Textzeilen geleitet werden). Wenn ich auf einem Microsoft-Betriebssystem feststecke, ist es die Shell, die ich verwenden würde.

Andere Shells für Windows, die die Leute zu mögen scheinen:

___ qstnhdr ___ Warum funktioniert mein Perl-Einzeiler nicht unter Windows? ___
Chas. Owens 20.03.2009 00:25
quelle
-2

Das Perl-Skript funktioniert von einer Linux-Shell. Vielleicht entkommst du etwas nicht richtig.

    
Mitch 19.03.2009 00:49
quelle

Tags und Links

Django: Verwenden von Annotate, Count und Distinct in einem Queryset ___ 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.)

    
___