Welche "for" -Schleife soll in Perl verwendet werden?

8

Was sind die Argumente für die Verwendung einer der for -Schleifen gegenüber der anderen, um durch Ganzzahlen zu zählen?

%Vor%     
Tim 22.04.2011, 16:04
quelle

5 Antworten

8

In Ihrem Fall gibt es keinen Unterschied.

In anderen Anwendungsfällen haben Sie in einer For-Each-Schleife keine Kontrolle über / Zugriff auf den Iterator.

Bearbeiten, um dies zu verdeutlichen:

Verwenden Sie Ihre Beispiel-Syntax:

%Vor%

Das obige erzeugt tatsächlich eine foreach -Schleife - es ist dasselbe wie foreach my $i (0..10) zu sagen. $i ist ein -Wert, der von der Liste zurückgegeben wird, nicht der Iterator. Der Iterator ist intern und Sie haben keinen Zugriff darauf; Sie können den Fluss der Schleife nicht steuern.

Die Ausgabe von oben wird 012345678910

ausgeben

Dies:

%Vor%

Das ist eine tatsächliche for-Schleife. Sie steuern und geben den Iterator aus. Es wird ausgegeben: 0246810

Bearbeiten: Zusätzlich:

Wenn Sie for (1..$n) aufrufen, rufen Sie den Bereichsoperator auf, anstatt einen einfachen Vergleich durchzuführen die Spitze der Schleife. Leistungsunterschiede wären jedoch unermesslich.

    
Brian Roach 22.04.2011 16:09
quelle
5

Der Unterschied zwischen den beiden Stilen von for loops in Perl ist eine von sowohl Klarheit als auch Effizienz.

Wenn Sie for my $i (0 .. $n) {...} betrachten, können Sie sofort den verwendeten Bereich sehen, ohne einen größeren Ausdruck mental analysieren zu müssen.

Mit for (my $i = 0; $i <= $n; $i++) {...} gibt es einiges mehr zu sehen und mehr Stellen, an denen sich Fehler einschleichen können.

Außerdem ist foreach in einem Bereich schneller als die entsprechende C-Style-Schleife, wie der folgende Benchmark zeigt:

%Vor%

was druckt:

%Vor%     
Eric Strom 22.04.2011 18:19
quelle
4

Mit der dreiteiligen for -Schleife können Sie $i += 3 und so, wenn Sie innerhalb der Schleife wollen, aber mit der foreach -Schleife nicht. Das ist der Unterschied.

    
tchrist 22.04.2011 16:15
quelle
4

Der off-by-one-Fehler, den Sie ursprünglich in der C-style-Schleife hatten, zeigt, dass die C-style-Schleife fehleranfälliger ist und nur verwendet werden sollte, wenn Sie tatsächlich Zugriff auf den Schleifenzähler benötigen. Eine foreach-Schleife macht es viel schwieriger, einen off-by-one-Fehler zu machen.

    
Ryan Thompson 22.04.2011 16:19
quelle
2

Ich glaube, dass die beiden von Ihnen geposteten Loop-Beispiele sich identisch verhalten. In beiden Fällen ist $i lexikalisch (da Sie das Schlüsselwort my verwenden). Ich denke, die 0..$n -Syntax ist klarer, aber (Überraschung!) Nicht alle würden damit einverstanden sein.

    
Ted Hopp 22.04.2011 16:13
quelle

Tags und Links