Модули - это один файл, файл .pm , содержащий код. Это может быть не пакет, ни один пакет, или несколько пакетов. Модулю на самом деле все равно, что в нем находится, поэтому это может быть код, вставляющий себя в то же пространство имен, более традиционный набор подпрограмм в библиотеке, или определяющий представление Perl о классе.
Пакет, также известный как пространство имен, содержит свои собственные переменные и подпрограммы. Это способ разделения различных частей вашей программы. Вы создаете пакет и помещаете в него свой код:
package SomePackage;
sub some_subroutine { ... } # really SomePackage::some_subroutine
Вы загружаете модуль для получения доступа к пакету:
use SomePackage; # read and compile the module file
SomePackage::some_subroutine( ... );
Класс Perl - это пакет и связанное с ним поведение. Методы в классе - это обычные подпрограммы, хотя, когда мы рассматриваем подпрограммы как методы, первый параметр - это объект (имя пакета или объект, также известный как референт), который вызывает метод:
package SomeClass;
sub class_method { my( $class, @args ) = @_; ... }
sub instance_method { my( $self, @args ) = @_; ... }
Поскольку класс является просто пакетом, как и любой другой пакет, и, вероятно, находится в модуле, вы обращаетесь к нему таким же образом с помощью use
:
use SomeClass;
my $i = SomeClass->class_method( ... );
Синтаксис стрелки OO делает некоторые специальные вещи, чтобы подпрограмма some_method
знала, что она вызывается как метод. Perl ставит референт (SomeClass
в данном случае) в качестве первого аргумента. Кроме того, при использовании синтаксиса OO Perl знает, как использовать его функции наследования.
Методы, вызываемые с помощью '->', получают референт в качестве первого параметра метода, поэтому этот вызов:
SomeClass->new('world');
является синтаксически, если вы вызвали его с именем класса в качестве первого параметра:
SomeClass::new( 'SomeClass' ,'world'); # no inheritance this way
Это работает так же и для объектов. Когда объект является референтом:
my $i = SomeClass->new();
$i->bar( 'world');
объект является первым параметром в качестве метода:
SomeClass::bar($i, 'world');