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

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

При выполнении вышеуказанного кода ваш выход будет: два, два. Насколько я понимаю, Perl является интерпретатором, поэтому, когда вызывается foo (mark1), не следует сначала печатать, а когда вызывается foo() (mark2), два должны быть напечатаны. Но почему два печатаются как раз, и, пожалуйста, объясните, как это сделать?Perl Функциональный вызов

+0

Вы уверены, что вы не компилируете его? – Carcigenicate

+4

'//' не являются комментариями в Perl. Вы должны использовать символ '#' для обозначения комментария. – simbabque

+0

Настоятельно рекомендуется всегда добавлять 'use warnings' и' use strict' в начало каждого файла Perl 5, пока вы точно не узнаете, почему это рекомендуется. –

ответ

8

Поскольку Perl не является интерпретированным языком так, как вы его понимаете. Код Perl компилируется до его запуска. Нет отдельного этапа компиляции для запуска, но компилятор разбирает и компилирует весь исходный код, прежде чем приступать к выполнению программы.

Если вы включили use warnings в вашем коде, то вы увидели бы следующее предупреждение (перед выходом из первого вызова функции):

Подпрограмма Foo переопределен в Func линии 12.

Который делает это довольно ясно, что происходит.

О, и кстати - // - не комментарий в Perl. Вы хотели #.