Подтвердить что ты не робот

Какая разница между "for" и "foreach" в Perl?

Я вижу, что они используются взаимозаменяемо. Какая разница?

4b9b3361

Ответ 1

Нет никакой разницы. Из perldoc perlsyn:

Ключевое слово foreach на самом деле является синонимом ключевого слова for, поэтому для краткости можно использовать foreach для чтения или for.

Ответ 2

Я вижу, что они используются взаимозаменяемо.

Нет никакой разницы, кроме синтаксиса.

Ответ 3

Четыре буквы.

Они функционально идентичны, просто написаны по-разному.

Ответ 4

С тех пор как его введение в perl-2.0, foreach было синонимом for. Это знак для команды оболочки foreach.

В моем собственном коде, в редком случае, когда я использую C-стиль для цикла, пишу

for (my $i = 0; $i < $n; ++$i)

но для итерации по массиву я описываю

foreach my $x (@a)

Я считаю, что он лучше читает в моей голове.

Ответ 5

Ключевое слово foreach на самом деле является синонимом ключевого слова for, поэтому вы можете использовать foreach для удобства чтения или для краткости. (Или потому, что оболочка Bourne вам больше знакома, чем csh, поэтому запись для нее происходит более естественно). Если VAR опущен, для каждого значения устанавливается значение $_.

Ответ 6

Из http://perldoc.perl.org/perlsyn.html#Foreach-Loops

Ключевое слово foreach на самом деле является синонимом ключевого слова for, поэтому вы может использовать либо. Если VAR опущен, для каждого значения установлено значение $_.

# Perl C-style
for (;;) {
    # do something
}

for my $j (@array) {
    print $j;
}

foreach my $j (@array) {
    print $j;
}

Однако:

Если какая-либо часть LIST является массивом, foreach будет очень запутанным, если вы добавлять или удалять элементы внутри тела цикла, например, с помощью сплайсинга. Так что не делайте этого.

Ответ 7

Существует тонкая разница (http://perldoc.perl.org/perlsyn.html#Foreach-Loops):

Цикл foreach выполняет итерацию над нормальным значением списка и устанавливает переменную VAR как каждый элемент списка по очереди. Если переменной предшествует ключевое слово my, то она лексически охвачена и, следовательно, отображается только внутри цикла. В противном случае переменная неявно локальна для цикла и возвращает свое прежнее значение после выхода из цикла. Если переменная была ранее объявлена ​​с помощью my, она использует эту переменную вместо глобальной, но она все еще локализована в цикле. Эта неявная локализация происходит только в цикле foreach.

Эта программа:

#!/usr/bin/perl -w

use strict;

my $var = 1;
for ($var=10;$var<=10;$var++) {
  print $var."\n"; # print 10
  foo(); # print 10
}

print $var."\n"; # print 11    

foreach $var(100) {
  print $var."\n"; # print 100
  foo(); # print 11 !
}

sub foo {
  print $var."\n";
}

будет производить следующее:

10
10
11
100
11

Ответ 8

В случае "для" вы можете использовать три шага.

1) Инициализация 2) Проверка состояния 3) Увеличение или уменьшение

Но в случае "foreach" вы не можете увеличивать или уменьшать значение. Он всегда принимает значение приращения как 1.