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
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.
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:
was druckt:
%Vor%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.
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.