Какова цель скобок в выражении Perl `foreach`? - PullRequest
5 голосов
/ 06 сентября 2010

Мне всегда интересно, почему я должен написать

foreach my $x (@arr)

вместо

foreach my $x @arr

Какова цель круглых скобок здесь?

Ответы [ 5 ]

8 голосов
/ 06 сентября 2010

Я могу думать только об одной конкретной причине для этого. Действителен следующий код:

for ($foo) {
    $_++
}

Если бы вы изменили это на

for $foo {
    $_++
}

Тогда вы действительно говорите

for $foo{$_++}

(то есть поиск хеша). Perl 6 решает эту проблему, изменяя способ работы с пробелами с переменными (вы не можете сказать %foo <bar>, и это означает то же самое, что %foo<bar>).

3 голосов
/ 06 сентября 2010

Кстати, вы можете использовать форму выражения for без скобок, например:

s/foo/bar/ foreach @arr; 

или

do { ... } foreach @arr;
2 голосов
/ 06 сентября 2010

Легкомысленный ответ: потому что так Ларри нравится понравилось, когда создавался Perl 5.

Более серьезный ответ: помогает устранить неоднозначность между «повторять по @arr, помещая каждое значение в $x» (for $x (@arr)) и «перебирать по $x и @arr, помещая каждое значение в $_ "(for ($x, @arr)). И, да, я понимаю, что лишняя запятая в последней версии делает возможным устранение неоднозначности даже без паренов, но для читателя-человека это менее очевидно, и я ожидаю, что использование только этого приведет к большему количеству ошибок.

0 голосов
/ 06 сентября 2010

Дэвид Б,

В этом контексте они должны быть эквивалентны, однако много раз скобки либо меняют порядок операции, в которой что-то выполняется, либо тип возвращаемой переменной (список).Различные функции могут по-разному обрабатывать списки и массивы / хэши.

Порядок операций

Во время цикла foreach обычно сортируется список:
foreach my $key (sort keys %hash) { ... }

Это также может быть записано как:
foreach my $key (sort(keys(%hash))) { ... }

Списки

С другой стороны, вы должны посмотреть на разницу между списком, массивом и хэшем.Списки обычно являются базовым типом, где хэш / массивы имеют дополнительные функции / возможности.Некоторые функции будут работать только со списками, но не с их скалярным аналогом.


Добавление:

Думаю, мне следует добавить, как Рэндал Шварц (соавтор первой книги о верблюдах)) в предыдущих цитатах указывало, что цикл for выполняется из C, а цикл foreach из Csh.То, что находится внутри скобок, используется для определения того, какой цикл используется в Perl.For / foreach может использоваться взаимозаменяемо только потому, что perl проверяет содержимое в () и затем определяет, какую конструкцию использовать.

0 голосов
/ 06 сентября 2010

В Perl есть два типа функций - одна работает в скалярном контексте, а другая - в контексте списка. 'Foreach' работает в контексте списка, поэтому скобки указывают его контекст.

вроде бы предположить массив:

@a = (1,2,3);

Итак, мы можем написать -

foreach my $x (@a)

OR

foreach my $x (1,2,3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...