my @array=(1..10); for my $i (@array){$i++;} print "array is now:@array";
это изменение значений массива.Почему?
Это то, для чего определено выражение for в Perl. См. Документацию для Петли по каждому элементу в man perlsyn:
for
man perlsyn
Если какой-либо элемент LIST является lvalue, вы можете изменить его, изменив VAR внутри цикла. И наоборот, если какой-либо элемент LIST НЕ является lvalue, любая попытка изменить этот элемент потерпит неудачу. Другими словами, переменная индекса цикла foreach является неявным псевдонимом для каждого элемента в списке, над которым вы работаете.
Это документированное поведение. См. perldoc perlsyn :
Цикл foreach повторяется по нормальное значение списка и устанавливает переменная VAR, чтобы быть каждым элементом список по очереди. Если какой-либо элемент LIST является lvalue, Вы можете изменить его, изменив VAR внутри петли. И наоборот, если есть элемент LIST не является lvalue, любой попытка изменить этот элемент будет потерпеть поражение. Другими словами, foreach переменная индекса цикла является неявным псевдоним для каждого элемента в списке, вы зациклены.
Цикл foreach повторяется по нормальное значение списка и устанавливает переменная VAR, чтобы быть каждым элементом список по очереди.
Если какой-либо элемент LIST является lvalue, Вы можете изменить его, изменив VAR внутри петли. И наоборот, если есть элемент LIST не является lvalue, любой попытка изменить этот элемент будет потерпеть поражение. Другими словами, foreach переменная индекса цикла является неявным псевдоним для каждого элемента в списке, вы зациклены.
Переменная цикла $i связывается с каждым элементом в массиве по очереди.
$i
Это означает, что при изменении $i вы изменяете массив.
Я полагаю, это потому, что в perl, когда вы перебираете массив, каждый элемент передается по ссылке, то есть, когда вы меняете $ i в цикле, он меняет фактическое значение в массиве. Я не уверен, как сделать так, чтобы это передавалось по значению.