2016-11-14 71 views
1
$\ = "\n"; 
sub foo 
{ 
    print("one"); 
} 
foo(); // mark1 

sub foo 
{ 
    print("two"); 
} 
foo(); //mark2 

在執行上面的代碼時,您的輸出將是:two,two。據我所知Perl是一個解釋器,所以當foo(mark1)被調用時,不應該先打印出來,並且當調用foo()(mark2)時,必須打印兩個。但是爲什麼兩個人同時打印,請解釋一下?Perl函數調用

+0

你確定你沒有編譯它嗎? – Carcigenicate

+4

''//在Perl中不是註釋。你必須使用'#'來表示註釋。 – simbabque

+0

定期推薦在每個Perl 5文件的開頭始終添加'use warnings'和'strict strict',直到您確切知道爲什麼推薦它。 –

回答

8

因爲Perl不像你理解的那樣是一種解釋型語言。 Perl代碼在運行之前進行編譯。沒有單獨的編譯步驟供您運行,但編譯器在開始執行程序之前解析並編譯所有源代碼。

如果您已經包含在您的代碼use warnings,然後你會看到下面的警告(從第一個函數調用輸出以前)的:

子程序foo的重新定義的FUNC線12

這使得它很清楚發生了什麼。

哦,順便說一句 - //不是Perl中的註釋。你想要#