爲什麼$a
成爲arrayref?我沒有推動任何事情。爲什麼Perl會在這種情況下自動生效?
perl -MData::Dumper -e 'use strict; 1 for @$a; print Dumper $a'
$VAR1 = [];
爲什麼$a
成爲arrayref?我沒有推動任何事情。爲什麼Perl會在這種情況下自動生效?
perl -MData::Dumper -e 'use strict; 1 for @$a; print Dumper $a'
$VAR1 = [];
這是因爲for
循環將@$a
的內容視爲左值 - 您可以分配給它。請記住for
將數組的內容別名爲$_
。看起來,在@$a
中查找可混淆內容的行爲足以導致自動版本化,即使沒有別名的內容。
這種混疊的效果也是一致的。下面還會導致自動激活:
map {stuff} @$a;
grep {stuff} @$a;
a_subroutine(@$a);
如果要管理自動激活,您可以使用the eponymous pragma實現詞彙的控制。
$a
成爲一個數組引用由於Perl的autovivification功能。
當您將值爲undef的標量變量當作任何引用時,Perl會將該值設爲您嘗試使用的引用類型。在這種情況下,$a
的值爲undef,當您使用@$a
時,它必須自動生成$a
中的數組引用,以便將其解引用爲數組引用。
好的,這裏是另一個例子: perl -MData :: Dumper -e'use strict; @ $ A;」 無法在-e行1中使用未定義的值作爲ARRAY參考。 – 2010-02-05 12:26:57
Perl在這種情況下不會自動生效。當它啓動時沒有任何規則,但通常在您想對變量執行某些操作時會發生autovivify。那裏沒有操作。 – 2010-02-05 12:47:41
$ 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.
自動激活在文檔中在'的perldoc -f exists'和'的perldoc perlref'(也參見http://perldoc.perl.org)中所討論。 – Ether 2010-02-05 18:52:05
@Ether:我錯過了perldoc -f存在的例子。 「存在$ ref - > {key}」的Autovivification令人驚訝。 – 2010-02-05 20:17:14