2010-03-30 55 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.