Ausgabe
Was ist der Unterschied in den beiden folgenden Fällen für die Dateierstellung.
open(DATA,">newfile.txt"); #1.using open function
close(DATA);
`touch newfile.txt`; #2.using touch command
Was ist besser und schneller? Hinweis: Wenn sowohl die Open-Funktion als auch der Touch-Befehl in Perl-Skripten verwendet werden und dies zum Erstellen leerer Dateien verwendet wird.
Lösung
Der klare Unterschied besteht darin, dass Sie im zweiten Fall zum System gehen. Es wird eine Shell gestartet, die den Befehl ausführt, oder der Befehl wird per execvp
Systemaufruf ausgeführt (abhängig von den Argumenten, siehe unten). Es passiert viel und es kann auch einiges schief gehen.
Noch wichtiger ist, dass es wirklich mehr zu tun gibt. Was ist, wenn die Datei bereits existiert? Zum einen open
wird es abgeschnitten, während touch
nur Zeitstempel aktualisiert werden. Aber Sie möchten eine neue Datei, also müssen Sie sie trotzdem zuerst überprüfen. Was ist, wenn dies fehlschlägt? Sie müssen überprüfen. Dies sollte also ein wenig Routine sein.
Dann schreiben Sie einfach alles in Perl. Es gibt keinen Vorteil, eine so einfache Aufgabe zu delegieren, nur Fallstricke.
Hinweis: Verwenden Sie drei Argumenteopen
open my $fh, '>', $file or ...
mit allen erforderlichen Kontrollen. Dann haben Sie auch ein viel schöneres lexikalisches (indirektes) Dateihandle , mit dem Sie arbeiten können.
Danke an hek2mgi für Kommentare und an ikegami für die Klarstellung, dass qx die Shell je nach Argumenten umgehen kann (was scheint undokumentiert?) † , ähnlich wie system es tut.
Dies kann per hek2mgi- Kommentar überprüft werden, indem wir strace -f script.pl
mit im Skript die Zeile findenqx(touch "NEW")
[pid 24332] execve("/bin/sh", ["sh", "-c", "touch \"NEWFILE\""], [/* ...
während /bin/sh
in der Ausgabe für qx(touch NEW)
kein steht (keine Anführungszeichen, keine Shell).
Beachten Sie, qx
dass ein Array (in den Dokumenten nicht erwähnt) akzeptiert wird, das eindeutig interpoliert wird. Dies ist an der Ausgabe von strace -f
on qx(@cmd)
mit zu sehen @cmd = qw(ls -l > tt.out)
, die hat
[pid 30773] execve("/bin/sh", ["sh", "-c", "ls -l > tt.out"], [/* ...
Dann läuft eine Shell bei Bedarf (dieses Beispiel) und sonst nicht ( qw(ls -l
)), wie oben besprochen.
† Aber zu diesem Zeitpunkt (Oktober 2022) finde ich es in qx
Dokumenten, laut und deutlich und offen
Beantwortet von – zdim
Antwort geprüft von – Gilberto Lyons (FixError Admin)