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.
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 vonopen
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, gibtclose
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.
Ganz allgemein bietet das IO::All
-Modul tatsächlich das Äquivalent eines Autochomps:
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).
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.