2016-09-16 2 views
2

Пожалуйста, объясните, почему так называемые функции Perl выше определения функции определяет, выполняются ли они или нет.Почему вы можете вызвать foo() и & foo перед объявлением sub foo, но вы не можете вызвать plain foo?

print "Why does this bare call to foo not run?\n"; 
foo; 
print "When this call to foo() does run?\n"; 
foo(); 
print "And this call to &foo also runs?\n"; 
&foo; 

sub foo { 
    print " print from inside function foo:\n"; 
} 

print "And this bare call to foo below the function definition, does run?\n"; 
foo; 

ответ

7

Вы можете пропускать круглые скобки только в вызове функции, если синтаксический анализатор знает, что данный идентификатор относится к функции.

Ваш первый foo; не является вызовом функции, потому что парсер еще не видел sub foofoo не является встроенным).

Если вы использовали use strict; use warnings; наверху, это было бы отмечено как ошибка.

3

perldata Quote,

Слово, которое имеет никакой другой интерпретации в грамматике не будет рассматриваться, как если бы это была строка в кавычках. Они известны как «простые слова».

Это означает, что foo эквивалентно "foo" отсутствии суб декларации, придав ему альтернативную интерпретацию.

$ perl -e'my $x = foo; print("$x\n");' 
foo 

Это считается неправильной функцией, поэтому она отключена по use strict; (или, более конкретно, с помощью use strict qw(subs);), чтобы поймать опечатки.

$ perl -e'use strict; my $x = foo; print("$x\n");' 
Bareword "foo" not allowed while "strict subs" in use at -e line 1. 
Execution of -e aborted due to compilation errors. 

Всегда используйте use strict; use warnings qw(all);!

Смежные вопросы