[FIXED] Unterschied zwischen “Öffnen-Funktion” und “Touch-Befehl” in Perl?

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 execvpSystemaufruf 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 openwird es abgeschnitten, während touchnur 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.plmit im Skript die Zeile findenqx(touch "NEW")

[pid 24332] execve("/bin/sh", ["sh", "-c", "touch \"NEWFILE\""], [/* ...

während /bin/shin der Ausgabe für qx(touch NEW)kein steht (keine Anführungszeichen, keine Shell).

Beachten Sie, qxdass ein Array (in den Dokumenten nicht erwähnt) akzeptiert wird, das eindeutig interpoliert wird. Dies ist an der Ausgabe von strace -fon 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 qxDokumenten, laut und deutlich und offen


Beantwortet von –
zdim


Antwort geprüft von –
Gilberto Lyons (FixError Admin)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like