попытка написать foreach в oneline на perl и сбой

#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, как я сказал в примерах. Надеюсь, теперь все более понятно.