2010-03-30 86 views
8

我刚才看到在我们的代码库的一些代码(和它的老代码,如Perl的3或Perl 4天),看起来像这样(我大大简化):Perl在这种情况下用这个参数来推动什么?

@array; 
push(array, $some_scalar); 

注意,arraypush()没有@。我会假设推后面的代码知道第一个参数应该是数组,因此可以从array typeglob获取数组。那或多或少呢?如果Perl能够毫无问题地完成这项工作,那么为什么你需要包含@呢?

+1

使用'use warnings'运行此代码,看看是否回答你的问题。 – mob 2010-03-30 19:15:39

+1

关于这个旧代码的警告将是一场无法解决的灾难,但我明白你的观点。 – Morinar 2010-03-30 19:18:09

+2

@Monirar:如果你不得不维护这段代码,改进它来运行警告启用可能证明非常有用。 – 2010-03-30 19:27:25

回答

9

这是解析器的一个老'功能'。如果变量是包变量,则@不是必需的。许多人认为这应该是固定的错误。你真的不应该这样做。

+0

但是,它似乎并没有实际执行推送。用这个:'perl -e'my @array =();推(阵列,“富”);打印“@array \ n”;“我没有输出。我做了一些愚蠢的事情? – Cascabel 2010-03-30 19:19:24

+2

也许它确实与typeglobs有关。 Jefromi上面的示例代码不会输出任何内容,但是如果您删除了“my”,那么它就会执行。 – mob 2010-03-30 19:23:52

+1

是的,你说得对。它似乎只适用于包变量。 – 2010-03-30 19:25:36

4

这是perl的一个可疑的“特性”,不推荐使用的行为;它应该是一个错误,但它的工作原理。

如果你打开编译器(perl的-W,强烈推荐)的警告,它警告说:

Array @aa missing the @ in argument 1 of push() at xx.pl line 2. 
相关问题