2 Stimmen

Gibt es Gründe, in Perl jemals die Zwei-Argument-Form von open(...) zu verwenden?

Gibt es einen Grund, die Zwei-Argument-Form von open(...) in Perl eher als die Versionen mit drei oder mehr Argumenten?

Der einzige Grund, der mir einfällt, ist die offensichtliche Feststellung, dass die Zwei-Argument-Form kürzer ist. Aber wenn man davon ausgeht, dass die Ausführlichkeit keine Rolle spielt, gibt es noch andere Gründe, die Sie dazu veranlassen würden, die Zwei-Argument-Form von open(...) ?

7voto

ysth Punkte 91645

Ein- und Zwei-Arg-Öffnen wendet alle Standard-Ebenen an, die mit der Option -C Schalter oder open pragma. Bei Three-arg open ist das nicht der Fall. Meiner Meinung nach ist dieser funktionale Unterschied der stärkste Grund, sich für das eine oder das andere zu entscheiden (und die Wahl wird davon abhängen, was Sie öffnen). Was ist am einfachsten oder am anschaulichsten oder am "sichersten" (Sie puede mit beliebigen Dateinamen verwenden, es ist einfach nicht so bequem) treten im Modulcode in den Hintergrund; im Skriptcode haben Sie mehr Ermessensspielraum bei der Entscheidung, ob Sie Standardebenen unterstützen wollen oder nicht.

Außerdem wird für Damian Conways File-Slurp-Operator ein Arg open benötigt.

$_ = "filename";
$contents = readline!open(!((*{!$_},$/)=\$_));

6voto

daxim Punkte 38607

Stellen Sie sich vor, Sie schreiben ein Dienstprogramm, das den Namen einer Eingabedatei akzeptiert. Menschen mit angemessener Unix-Erfahrung sind es gewohnt, den Namen einer Datei durch - für STDIN. Perl handhabt das automatisch nur, wenn die magisch Form verwendet wird wo die Moduszeichen und der Dateiname eine einzige Zeichenkette sind, ansonsten müssen Sie diesen und ähnliche Sonderfälle selbst behandeln. Dies ist ein häufiger Fehler, und ich bin überrascht, dass noch niemand darüber geschrieben hat. Beweise:

use IO::File qw();
my $user_supplied_file_name = '-';

IO::File->new($user_supplied_file_name, 'r') or warn "IO::File/non-magical mode - $!\n";
IO::File->new("<$user_supplied_file_name")   or warn "IO::File/magical mode - $!\n";
open my $fh1, '<', $user_supplied_file_name  or warn "non-magical open - $!\n";
open my $fh2, "<$user_supplied_file_name"    or warn "magical open - $!\n";

__DATA__
IO::File/non-magical mode - No such file or directory
non-magical open - No such file or directory

5voto

kriss Punkte 22473

Ein weiterer kleiner Unterschied: die beiden Argumente bilden Beschnittzeichen

$foo = " fic";
open(MH, ">$foo");
print MH "toto\n";

Schreibt in eine Datei namens fic

Andererseits

$foo = " fic";
open(MH, ">", $foo);
print MH "toto\n";

Schreibt in eine Datei, deren Name mit einem Leerzeichen beginnt.

Für kurze Verwaltungsskripte mit Benutzereingaben (oder Konfigurationsdateieingaben) ist es angenehm, dass man sich nicht mit solchen Details wie dem Abschneiden von Dateinamen herumschlagen muss.

4voto

Alan Haggai Alavi Punkte 69510

Die Zwei-Argument-Form von open war die einzige Form, die von einigen alten Versionen von perl .

3voto

William Rose Punkte 961

Wenn Sie aus einer Pipe öffnen, ist die Form mit drei Argumenten nicht wirklich hilfreich. Um das Äquivalent der Drei-Argumente-Form zu erhalten, muss man ein sicheres Pipe-Open durchführen ( open(FILE, '|-') ) und dann die Ausführung des Programms.

Für einfache Rohröffnungen (z. B. open(FILE, 'ps ax |') ), ist die Syntax mit zwei Argumenten viel kompakter.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X