для цикла в Perl - PullRequest
       1

для цикла в Perl

2 голосов
/ 26 декабря 2010
my @array=(1..10);
for my $i (@array){$i++;}
print "array is now:@array";

это изменение значений массива.Почему?

Ответы [ 4 ]

6 голосов
/ 26 декабря 2010

Это то, для чего определено выражение for в Perl. См. Документацию для Петли по каждому элементу в man perlsyn:

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

3 голосов
/ 26 декабря 2010

Это документированное поведение. См. perldoc perlsyn :

Цикл foreach повторяется по нормальное значение списка и устанавливает переменная VAR, чтобы быть каждым элементом список по очереди.

Если какой-либо элемент LIST является lvalue, Вы можете изменить его, изменив VAR внутри петли. И наоборот, если есть элемент LIST не является lvalue, любой попытка изменить этот элемент будет потерпеть поражение. Другими словами, foreach переменная индекса цикла является неявным псевдоним для каждого элемента в списке, вы зациклены.

1 голос
/ 26 декабря 2010

Переменная цикла $i связывается с каждым элементом в массиве по очереди.

Это означает, что при изменении $i вы изменяете массив.

0 голосов
/ 26 декабря 2010

Я полагаю, это потому, что в perl, когда вы перебираете массив, каждый элемент передается по ссылке, то есть, когда вы меняете $ i в цикле, он меняет фактическое значение в массиве. Я не уверен, как сделать так, чтобы это передавалось по значению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...