2010-02-05 151 views
4

爲什麼$a成爲arrayref?我沒有推動任何事情。爲什麼Perl會在這種情況下自動生效?

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

自動激活在文檔中在'的perldoc -f exists'和'的perldoc perlref'(也參見http://perldoc.perl.org)中所討論。 – Ether 2010-02-05 18:52:05

+0

@Ether:我錯過了perldoc -f存在的例子。 「存在$ ref - > {key}」的Autovivification令人驚訝。 – 2010-02-05 20:17:14

回答

8

這是因爲for循環將@$a的內容視爲左值 - 您可以分配給它。請記住for將數組的內容別名爲$_。看起來,在@$a中查找可混淆內容的行爲足以導致自動版本化,即使沒有別名的內容。

這種混疊的效果也是一致的。下面還會導致自動激活:

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

如果要管理自動激活,您可以使用the eponymous pragma實現詞彙的控制。

3

當您將值爲undef的標量變量當作任何引用時,Perl會將該值設爲您嘗試使用的引用類型。在這種情況下,$a的值爲undef,當您使用@$a時,它必須自動生成$a中的數組引用,以便將其解引用爲數組引用。

+1

好的,這裏是另一個例子: perl -MData :: Dumper -e'use strict; @ $ A;」 無法在-e行1中使用未定義的值作爲ARRAY參考。 – 2010-02-05 12:26:57

+3

Perl在這種情況下不會自動生效。當它啓動時沒有任何規則,但通常在您想對變量執行某些操作時會發生autovivify。那裏沒有操作。 – 2010-02-05 12:47:41

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. 
相關問題