Объявление и определение

Понятия объявления и определения в контексте Perl (особенно предыдущих версий) встречаются не очень часто. Однако, с развитием языка и учитывая идеологическую близость отдельных категорий категориям языка C++, есть смысл объяснить различие между объявлением и определением. К сожалению, путаница встречается и в книгах, особенно переводных.

Различие между терминами объявление (declaration) и определение (definition) весьма существенное и тем не менее легкое для понимания. Объявление лишь вводит в область видимости некое имя (переменной, функции или класса), в то время как определение однозначно определяет объект (для переменной — выделяет память и инициализирует некоторым значением, для функции — описывает ее тело).

Возвратимся к предыдущему примеру. В комментариях указано, что является объявлением, а что — определением.

sub func(); # Объявление функции func()
sub main(){ # Определение функции main()
func();
}
sub func(){ # Определение функции func()
print «func()\n»;
}
Исходя из задач, возложенных на определение и объявление следует, что объявления могут неоднократно повторяться (по крайней мере, если это не запрещает компилятор), а определение всегда должно быть только одно. В Perl 6 допустим, например, такой код:

Разумеется, в этом примере повторные объявления бессмысленны. Возможность многократных объявлений приносит пользу при сборке программы из нескольких модулей.

sub func();
sub func();
sub main();
sub main(){
func();
}
sub func(){
print «func()\n»;
}