[Moscow.pm] Убейте меня пока я не сошел с ума.

Сергей Мартынов sergey на martynov.info
Вс Фев 3 14:30:32 PST 2008


> > Это задокументированное поведение

> Что-то я раньше такого не наблюдал :(
> блин. Как то даже и не думал об этом.

Всю жизнь так было, вообще то ;)

If any element of LIST is an lvalue, you can modify it by modifying
VAR inside the loop. Conversely, if any element of LIST is NOT an
lvalue, any attempt to modify that element will fail. In other words,
the foreach loop index variable is an implicit alias for each item in
the list that you're looping over.

В разных версиях фразы меняются, но смысл один и тот же ;)

http://search.cpan.org/~rgarcia/perl-5.10.0/pod/perlsyn.pod#Foreach_Loops__
http://search.cpan.org/~nwclark/perl-5.8.8/pod/perlsyn.pod#Foreach_Loops__
http://search.cpan.org/~gsar/perl-5.6.1/pod/perlsyn.pod#Foreach_Loops
http://search.cpan.org/~andyd/perl5.003_07/pod/perlsyn.pod#Foreach_Loops


Это позволяет делать удобные вещи типа пачки обработок для переменных:

for ($one_string, $other_string) {
  s/^\s+//;
  s/\s+$//;
  s/\s+/ /g;
}

или использовать как аналог конструкции with:

for ($some->{long}->obect->[3]->{call}) {
  $_->set( foo => 1 );
  $_->set( bar => 2 );
  $_->do_method();
}


-- 
С уважением, Сергей Мартынов.


Подробная информация о списке рассылки Moscow-pm