#perl #syntax #for-loop #foreach #simplify
#perl #синтаксис #for-цикл #foreach #упростить
Вопрос:
новичок в perl, пытаюсь немного поиграть с его синтаксисом, затем я получил это сообщение об ошибке
$ perl testP
syntax error at testP line 3, near "$_ ("
Execution of testP aborted due to compilation errors.
для:
$_=$_ 1 foreach $_ (@_);
Кто-нибудь может сказать мне, что пошло не так и как это исправить? Спасибо.
Ответ №1:
переменная foreach (массив) используется в обычной нотации, такой как:
foreach $_ ( @_ ) {
$_ = $_ 1;
}
Но вы использовали обратную запись, то есть сначала операция, а затем цикл.
В этом случае вы не можете указать имя переменной для цикла (что в любом случае бесполезно, поскольку вы используете переменную по умолчанию $ _), и цикл должен выглядеть:
$_ = $_ 1 foreach @_;
Пожалуйста, также обратите внимание, что вы можете использовать for
вместо foreach
, и если вы просто хотите увеличить переменную, вы можете сделать это с помощью оператора , таким образом, превратив его в:
$_ for @_;
Ответ №2:
$_
будут получены разные значения @_
на каждой итерации foreach, и
оператор будет постинкрементировать значения.
Итак, что-то вроде этого будет работать:
foreach (@_) {$_ ;}
Примечание: $_
эквивалентно $_ = $_ 1
$_
и @_
являются специальными переменными в perl, и они имеют особое поведение, в данном случае $_
в контексте цикла foreach принимает текущее значение на каждой итерации.
Специальные переменные являются одной из сложных и мощных частей perl. Вы можете получить дополнительную информацию о том, как они работают, в специальной документации по vars.
Другое дело, что вам не следует использовать специальную переменную в качестве целевого объекта foreach
, поскольку они, скорее всего, не будут работать должным образом (см. Также Документацию foreach)
Комментарии:
1.
$_ for @a
работает также в случае, если OP хочет использовать альтернативный синтаксис.2. Я все еще не совсем понимаю, почему post, увеличивающий значение $ _, не должен работать. почему написание like
foreach (@_) {$_ ;}
отличается от написания like$_=$_ 1 foreach $_ (@_);
3. Спасибо за ответ, ценю это.
4. Если требуется получить количество элементов в $ _, то это не сработает, потому что foreach local()использует $_ . После цикла $_ будет содержать любое значение, которое оно имело до цикла, и счетчик будет недоступен…
5. @user685275: Во-первых,
foreach
либо вы указываете переменную (например,foreach $myvar (@myarray)
{ /* делайте что угодно с $ myvar * /}), либо вы ничего не указываете и используете специальный var $ _ (например,foreach (@myarray) { /* do whatever with $_ */}
, с другой стороны, у вас неправильный синтаксис, предложение, которое вы хотите выполнить (если я правильно понял$_=$_ 1
), идет после foreach, как я сказал в примерах. Надеюсь, теперь все более понятно.