2010-03-11 17 views
6

ich in einem Modul eines for-Schleife wie dieseFrage zum foreach-Wert

geschrieben gefunden habe
for(@array) { 
    my $scalar = $_; 
    ... 
    ... 
} 

Gibt es Unterschiede zwischen diesem und der folgenden Art und Weise einer for-Schleife zu schreiben?

for my $scalar (@array) { 
    ... 
    ... 
} 

Antwort

11

Ja, im ersten Beispiel die for Schleife als topicalizer handelt (Einstellung $_, die das Standardargument für viele Perl-Funktionen ist) über die Elemente im Array. Dies hat den Nebeneffekt, dass der Wert $_ außerhalb der for Schleife maskiert wurde. $_ hat einen dynamischen Bereich und ist in allen Funktionen sichtbar, die innerhalb der for-Schleife aufgerufen werden. Sie sollten diese Version der for Schleife in erster Linie verwenden, wenn Sie die Verwendung von $_ für seine speziellen Funktionen planen. Im ersten Beispiel ist $scalar eine Kopie des Werts im Array, während im zweiten Beispiel $scalar ein Alias ​​für den Wert im Array ist. Dies ist wichtig, wenn Sie den Wert des Arrays innerhalb der Schleife festlegen möchten. Oder, wie daotoad hilfreich zeigt, ist das erste Formular nützlich, wenn Sie eine Kopie des Array-Elements benötigen, um daran zu arbeiten, z. B. mit destruktiven Funktionsaufrufen (chomp, s///, tr/// ...).

Und schließlich wird das erste Beispiel marginal langsamer sein.

+0

Gute Antwort, ++. Ich stimme jedoch nicht zu, dass 'for (@array) {}' nur verwendet werden sollte, wenn Sie hauptsächlich mit '$ _' arbeiten. Die Tatsache, dass die erste Version eine Kopie erzwingt, ist vorteilhaft, wenn Sie vorhaben, den Wert von $ scalar zu ändern. Es gibt keinen Grund, 'für meinen $ alias (@array) {my $ scalar = $ alias; ...} '. Dies ist in einer besonders gültigen Verwendung der topicizer Form der for-Schleife. – daotoad

+0

@daotoad => Ich stimme zu, antworten aktualisiert, danke für das Abfangen –

3

$_ ist der "Standardeingabe- und Musterabgleichplatz". Mit anderen Worten, wenn Sie von einem Datei-Handle am Anfang einer while-Schleife einlesen oder eine foreach-Schleife ausführen und keine Loop-Variable benennen, wird $_ für Sie eingerichtet.

Wenn Sie jedoch eine foreach-Schleife schreiben und eine Schleife Variablenname, wird $ _ nicht gesetzt up.This kann durch folgenden Code gerechtfertigt werden:

1. #!/usr/bin/perl -w 
2. @array = (1,2,3); 
3. foreach my $elmnt (@array) 
4. { 
5. print "$_ "; 
6. } 

Der Ausgang „Die Verwendung von nicht initialisierten Wert in Verkettung sein (.)“

jedoch, wenn Sie ersetzen Zeile 3 von:

foreach (@array) 

Der Ausgang "1 2 3", wie erwartet.

Jetzt ist es immer besser, eine Schleifenvariable in einer foreach-Schleife zu benennen, um den Code lesbarer zu machen (Perl ist schon wegen der geringeren Lesbarkeit verflucht), so dass auch keine explizite Notwendigkeit besteht Zuweisung an die Variable $_ und die daraus resultierenden Probleme mit dem Umfang.