Это потому, что цикл for
обрабатывает содержимое @$a
как lvalues - то, что вы можете назначить. Помните, что for
псевдоним содержимого массива к $_
. Похоже, что сам поиск псевдонима в @$a
достаточен, чтобы вызвать автовивификацию, даже если в псевдониме нет содержимого.
Этот эффект псевдонима также постоянен. Следующее также приводит к автовивификации:
map {stuff} @$a;
grep {stuff} @$a;
a_subroutine( @$a);
Если вы хотите управлять автовивификацией, вы можете использовать одноименную прагму для создания лексических элементов управления.