2010-02-05 1 views
4

Почему $a стал массивом? Я ничего не нажимаю на это.Почему Perl autovivify в этом случае?

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

Autovivification обсуждается в документации на 'perldoc -f exists' и' perldoc perlref' (смотрите также http://perldoc.perl.org). – Ether

+0

@ Другие: я пропустил эти примеры в perldoc -f. Автовычисление «существует $ ref -> {key}» является неожиданным. –

ответ

8

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

Этот эффект наложения также согласован. Ниже также привести к autovivification:

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

Если вы хотите управлять autovivification, вы можете использовать the eponymous pragma для осуществления лексических управления.

3

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

+1

Хорошо, вот еще один пример: perl -MData :: Dumper -e 'use strict; @ $ А;» Невозможно использовать неопределенное значение в качестве ссылки ARRAY на -e строке 1. –

+3

В этом случае Perl не автовосстанавливает. Там нет ни одного правила, когда оно начнется, но обычно autovivify происходит, когда вы хотите что-то сделать с переменной. Там нет операции. –

0

$ 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. 

 Смежные вопросы

  • Нет связанных вопросов^_^