Я не на 100% уверен, что ваш вопрос, но вот попытка ответить:
- Как аргументы подпрограммы работают в Perl?
- КакРабота конструктора в Perl?
Ответы:
Как работают аргументы подпрограмм?
Подпрограммы в Perl немного необычны.См. Perldoc perlsub для всех деталей.
Краткая версия заключается в том, что при любом вызове подпрограммы передается список аргументов .Вызванный код должен обрабатывать список так, как ему нужно.
Список аргументов хранится в специальном массиве @_
.Члены @_
на самом деле являются псевдонимами передаваемых значений (представьте их в терминах передачи по ссылке), поэтому можно изменить вызывающий аргумент.Чтобы избежать несчастных случаев, большинство подпрограмм копирует элементы @_
в локальные переменные.Когда вы видите my ($foo, $bar) = @_;
, он копирует первых двух членов @_
в $foo
и $bar
.Еще одна распространенная идиома - my $foo = shift;
.Это удаляет первый элемент из @_
и копирует его в $foo
.
Как работает конструктор?
В Perl методы OO - это просто подпрограммы, и конструктор ничем не отличается.
Когда вы вызываете метод $foo->do_this()
или MyCoolClass->new()
элемент в левой части оператора ->
называется invocant .Инвокант определяет, в каких пространствах имен (пакеты в терминах perl) будет выполняться поиск метода.Когда инвокант является строковым литералом, он считается именем пакета или класса, в котором начинается поиск. Когда инвокант является скалярным, он должен быть объектом.В любом случае инвокант также передается в качестве первого аргумента методу, когда он найден и вызван.Таким образом, метод класса (такой как new()
) будет ожидать строку для своего первого аргумента, в то время как метод экземпляра будет ожидать объект.
Конструктор, обычно new()
, обычно это метод класса, который создаетэкземпляр класса, к которому он принадлежит.Поэтому Foo->new()
создаст новый объект Foo
.
Объект perl - это любая ссылка, которая была связана с пакетом с помощью функции bless.
Давайте посмотрим на вашконструктор и посмотрите, как он работает:
sub new {
# Unpack @_ into local variables
# Notice that the class name is the first argument.
my ($classe, $hostname, $oid, $community) = @_;
# Create a reference to a hash with the arguments associated
# to particular keys in the hash.
my $this = {
"hostname" => $hostname,
"oid" => $oid,
"community" => $community
};
# Associate the hash ref with the class
bless($this, $classe);
# $this is now an object. You can make method calls on it here.
return $this;
}
Поскольку конструктор подобен любому другому методу или подпрограмме в Perl, вы можете делать в нем все, что захотите.Обычно считается хорошей идеей сохранять ваши подпрограммы как можно более простыми, но нет никаких причин, по которым вы не можете создать объект Net :: SNMP в своем конструкторе.Если вы его сделаете, вам, вероятно, следует сохранить его для дальнейшего использования.
sub new {
my ($classe, $hostname, $oid, $community) = @_;
my $this = {
"hostname" => $hostname,
"oid" => $oid,
"community" => $community,
"connexion" => undef,
};
bless($this, $classe);
# Store the connection for later.
# You could also modify connexion so that it stores the connection for you.
$this->{connexion} = $this->connexion;
return $this;
}
Весь этот код предполагает, что мы хотим использовать классические методы Perl OOP.Хотя эти методы работают хорошо, вокруг среды Moose Perl OO существует огромное количество активности.Moose упрощает написание твердого, хорошо инкапсулированного ОО-кода на Perl.
Я настоятельно рекомендую вам взять копию книги, например Modern Perl .Он даст вам обновленный взгляд на OO-инструменты Perl, введение в Moose, а также продемонстрирует множество простых техник, которые значительно упростят поддержку вашего кода.
Надеюсь, это полезно.