Почему Perl автовивирует в этом случае? - PullRequest
4 голосов
/ 05 февраля 2010

Почему $a становится arrayref? Я ничего к этому не подталкиваю.

perl -MData::Dumper -e 'use strict; 1 for @$a; print Dumper $a'
$VAR1 = [];

Ответы [ 4 ]

8 голосов
/ 05 февраля 2010

Это потому, что цикл for обрабатывает содержимое @$a как lvalues ​​- то, что вы можете назначить. Помните, что for псевдоним содержимого массива к $_. Похоже, что сам поиск псевдонима в @$a достаточен, чтобы вызвать автовивификацию, даже если в псевдониме нет содержимого.

Этот эффект псевдонима также постоянен. Следующее также приводит к автовивификации:

  • map {stuff} @$a;
  • grep {stuff} @$a;
  • a_subroutine( @$a);

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

3 голосов
/ 05 февраля 2010

Когда вы обрабатываете скалярную переменную со значением undef как любую ссылку, Perl делает значение ссылочным типом, который вы пытались использовать. В этом случае $a имеет значение undef, а когда вы используете @$a, он должен автоматически активировать ссылку на массив в $a, чтобы вы могли разыменовать его как ссылку на массив.

0 голосов
/ 27 апреля 2011

$ a и $ b являются специальными переменными в Perl (используются в sort) и имеют особую собственную область видимости.

perl -MData::Dumper -e 'use strict; 1 for @$c; print Dumper $c'

производит

Global symbol "$c" requires explicit package name at -e line 1.
Global symbol "$c" requires explicit package name at -e line 1.
Execution of -e aborted due to compilation errors.
0 голосов
/ 05 февраля 2010

$a становится ссылкой ARRAY из-за функции Perl .

...