Почему $a
стал массивом? Я ничего не нажимаю на это.Почему Perl autovivify в этом случае?
perl -MData::Dumper -e 'use strict; 1 for @$a; print Dumper $a'
$VAR1 = [];
Почему $a
стал массивом? Я ничего не нажимаю на это.Почему Perl autovivify в этом случае?
perl -MData::Dumper -e 'use strict; 1 for @$a; print Dumper $a'
$VAR1 = [];
Это потому, что цикл for
обрабатывает содержимое @$a
как lvalues - то, что вы можете назначить. Помните, что for
псевдонизирует содержимое массива до $_
. Похоже, что поиск одинакового содержимого в @$a
является достаточным для того, чтобы вызвать автовизацию, даже если в псевдонимы нет содержимого.
Этот эффект наложения также согласован. Ниже также привести к autovivification:
map {stuff} @$a;
grep {stuff} @$a;
a_subroutine(@$a);
Если вы хотите управлять autovivification, вы можете использовать the eponymous pragma для осуществления лексических управления.
$a
становится ссылка ARRAY благодаря autovivification функции Perl.
Когда вы обрабатываете скалярную переменную, значение которой равно undef как любая ссылка, Perl делает значение типа ссылки, который вы пытались использовать. В этом случае $a
имеет значение undef, и когда вы используете @$a
, он должен автогенерировать ссылку на массив в $a
, чтобы вы могли разыменовать его как ссылку на массив.
Хорошо, вот еще один пример: perl -MData :: Dumper -e 'use strict; @ $ А;» Невозможно использовать неопределенное значение в качестве ссылки ARRAY на -e строке 1. –
В этом случае Perl не автовосстанавливает. Там нет ни одного правила, когда оно начнется, но обычно autovivify происходит, когда вы хотите что-то сделать с переменной. Там нет операции. –
$ a и $ b являются специальными переменными в Perl (используются в сортировке) и имеют специальную область действия.
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.
Autovivification обсуждается в документации на 'perldoc -f exists' и' perldoc perlref' (смотрите также http://perldoc.perl.org). – Ether
@ Другие: я пропустил эти примеры в perldoc -f. Автовычисление «существует $ ref -> {key}» является неожиданным. –