Haben wir eine Autochomp in Perl?

8

So sieht mein Perl-Code für aus Überwachen eines Unix-Ordners :

%Vor%
  • Ein chomp nach jeder Zuweisung zu machen, sieht nicht gut aus. Gibt es eine Möglichkeit, einen Autochomp zu machen?

  • Ich bin neu bei Perl und habe diesen Code vielleicht nicht auf die beste Art und Weise geschrieben. Vorschläge zur Verbesserung des Codes sind willkommen.

Lazer 12.09.2010, 10:17
quelle

5 Antworten

14

Benutze die Shell nicht, dann.

%Vor%

Das Ergebnis ist etwas anders: Die Ausgabe des Befehls date enthält eine Zeitzone, aber der Wert von $date oben wird nicht angezeigt. Wenn dies ein Problem ist, folgen Sie dem hervorragenden Vorschlag von Chas. Owens und benutze strftime , um das gewünschte Format zu erhalten.

Dein Sub

%Vor%

wird automatisch fehlschlagen, wenn etwas schief geht. Stille Ausfälle sind unangenehm. Besser wäre Code in der Art von

%Vor%

Die Verwendung von system anstelle von Backticks ist expressiver für Ihre Absicht, da Backticks zum Erfassen der Ausgabe dienen. Das system(LIST) -Form umgeht die Shell und muss sich darum kümmern, Argumente zu zitieren.

Wenn wir den Effekt der Shell-Pipeline echo ... | mail ... ohne die Shell erhalten, müssen wir selbst ein bisschen Klempnerarbeit machen, aber der Vorteil - wie bei system(LIST) - muss sich nicht um Shell-Zitate kümmern. Der obige Code verwendet viele Argumente open :

  

Bei drei oder mehr Argumenten, wenn MODE '|-' ist, wird der Dateiname als Befehl interpretiert, an den die Ausgabe übergeben werden soll. Wenn MODE '-|' ist, wird der Dateiname als Befehl interpretiert, der die Ausgabe an uns leitet . Im Formular mit zwei Argumenten (und einem Argument) sollte der Bindestrich ( '-' ) durch den Befehl ersetzt werden. Siehe Verwenden von open für IPC in perlipc für weitere Beispiele.

Der open übergibt einen mail Prozess, und $fh ist mit seiner Standardeingabe verbunden. Der übergeordnete Prozess (der Code wird weiterhin ausgeführt touchandmail ) übernimmt die Rolle von echo mit print $fh $msg . Der Aufruf von close löscht die E / A-Puffer des Handles plus ein wenig mehr, weil wir es geöffnet haben:

  

Wenn das Dateihandle von einem verrohrten open stammt, gibt close den Wert false zurück, wenn einer der anderen beteiligten Syscalls fehlschlägt oder wenn das Programm mit einem Status ungleich Null beendet wird. Wenn das einzige Problem darin besteht, dass das Programm ungleich Null beendet wird, wird $! auf 0 gesetzt. Das Schließen einer Pipe wartet auch darauf, dass der auf der Pipe ausgeführte Prozess beendet wird - falls Sie danach die Ausgabe der Pipe betrachten wollen -und gibt implizit den Exit-Status-Wert dieses Befehls in $? und ${^CHILD_ERROR_NATIVE} ein.

    
Greg Bacon 12.09.2010, 11:01
quelle
6

Ganz allgemein bietet das IO::All -Modul tatsächlich das Äquivalent eines Autochomps:

%Vor%

oder allgemeiner:

%Vor%

Zugegeben, für diesen speziellen Fall von date stimme ich den anderen Beantwortern zu, dass es wahrscheinlich besser ist, eines der DateTime-Module zu verwenden, aber wenn Sie einfach nur eine Datei einlesen und alle Ihre Zeilen chomp ed, dann IO::All mit den Optionen chomp und tie ist sehr praktisch.

Beachten Sie auch, dass der Trick chomp nicht funktioniert, wenn der gesamte Inhalt des Handles direkt in einen Skalar gerieben wird (das ist genau so, wie er implementiert wird).

    
jsegal 12.09.2010 13:45
quelle
5

Versuchen Sie es in eine Funktion zu setzen:

%Vor%

Und dann rufe das für jeden Befehl auf, den du ausführen willst und dann chomp.

    
Nathan Fellman 12.09.2010 10:28
quelle
4

Verwenden Sie DateTime oder andere Datumsmodule in CPAN anstelle des Datumsprogramms.

Zum Beispiel:

%Vor%     
jira 12.09.2010 10:33
quelle
2

Es ist möglich, und chomp in einer einzigen Zeile mit der folgenden Syntax zuzuweisen:

%Vor% Um mehr zu sprechen, wenn Sie sich immer und immer wieder wiederholen, rollen Sie es in ein Sub:

%Vor%     
Zaid 12.09.2010 10:33
quelle

Tags und Links