Что делает этот Perl-код? - PullRequest
2 голосов
/ 02 июля 2010

Пожалуйста, объясните код Perl ниже:

sub new {
    my $class = shift;
    my $self = {property => 'u', provider => 'ramesh'};
    bless $self, $class;
    return $self;
}

Ответы [ 4 ]

28 голосов
/ 02 июля 2010

Это конструктор для объекта Perl.Объекты Perl могут быть сделаны из любой ссылки Perl.Это происходит из хеш-ссылки (код {property => …} создает хеш-ссылку).См. perlobj manpage .

Обычно такой код можно найти в пакете, который является контейнером для методов класса и его экземпляров:

package Foo;

sub new {
    my $class = shift;                                   # 2
    my $self = {property => 'u', provider => 'ramesh'};  # 3
    bless $self, $class;                                 # 4
    return $self;                                        # 5
}

sub poll {
    my ($self)=@_;                                       # 7
    $self->{CurrentFile}="data.xml";                     # 8
    return $self->http->get("URL given");                # 9
}

Затем в другом коде вы используете его так:

my $myfoo = Foo->new();                                  # 1

Теперь $myfoo содержит экземпляр Foo.Затем вы можете вызывать методы объекта:

$myfoo->poll();                                          # 6

Строковое описание (замените Foo на любое фактическое имя пакета в коде):

  1. my $myfoo = Foo->new();
    Вызывает «метод класса» new класса Foo и сохраняет результат в скалярной переменной $myfoo.Технически этот вызов аналогичен Foo::new("Foo") (без необходимости повторения Foo).См. Вызов метода в perlobj .

  2. my $class = shift;
    Список аргументов, представленный в вызове new, содержит толькоимя класса.
    shift удаляет и возвращает первое значение из переменной массива @_, которая содержит значения параметров, заданные при вызове метода.См. perlsub для получения подробной информации о передаче параметров и массиве @_.
    Итак, этот оператор сохраняет имя класса "Foo" в локальной скалярной переменной $class.

  3. my $self = {property => 'u', provider => 'ramesh'};
    Создайте ссылку на новый анонимный хеш {…} с некоторыми исходными парами ключ / значение и сохраните ее в локальной скалярной переменной $self.Подробнее о создании ссылок см. perlref .

  4. bless $self, $class;
    Превратите хеш-ссылку, хранящуюся в $self, в объект Foo с помощью « благослови добавив его в класс Foo (помните, $class eq "Foo").

  5. return $self;
    Возвращение вновь созданного объекта.

  6. $myfoo->poll();
    Вызвать метод poll объекта, содержащегося в скалярной переменной $myfoo.

  7. my ($self)=@_;
    Первым параметром для методов экземпляра является сам экземпляр объекта.
    Этот оператор сохраняет первое значение из переменной массива параметров @_ в новой локальной скалярной переменной $self.

  8. $self->{CurrentFile}="data.xml";
    Мы знаем из new, что $self будет хеш-ссылкой.
    Этот оператор присваивает значение ключу CurrentFile в хеш-ссылке, которая воплощает объект.

  9. return $self->http->get("URL given");
    Вызовите метод http для объекта $self.
    В случае возврата объекта, возвращенного из метода http, вызовите * 1Метод 117 * (передача "URL given" в качестве аргумента).
    Возврат результата вызова в get.

3 голосов
/ 02 июля 2010

Этот код сам по себе ничего не делает.Но если у вас есть файл

package Why::Am::I::So::Funky;

sub new {
    my $class = shift;
    my $self = {property => 'u', provider => 'ramesh'};
    bless $self, $class;
    return $self;
}

1;

и другой файл, подобный

use Why::Am::I::So::Funky;
my $funky = Why::Am::I::So::Funky->new ();

, то это создаст объект Why :: Am :: I :: So ::Классный класс под названием $funky.

1 голос
/ 02 июля 2010

В этом коде вы создаете объект класса. здесь $self - хеш, содержащий две ключевые записи, свойство и провайдера и их соответствующие значения.

bless - это встроенная функция Perl, которая принимает один или два параметра, первый аргумент является референтом, а второй - пакетом, который благословляет референта. Если второй аргумент опущен, то используется текущий пакет.

Теперь после благословения вы можете использовать $self->{property}, который даст вам 'u', и $self->{provider}, который даст вам 'ramesh', в текущем пакете.

Лучший способ изучить Perl - прочитать стандартную книгу Programming Perl by the inventor itself.

0 голосов
/ 05 июля 2010

Чтение perlboot , Объектно-ориентированное руководство для начинающих и perltoot , Tom's объектно-ориентированное руководство по Perl , для изучения объектно-ориентированного программирования на Perl:

perldoc perlboot
perldoc perltoot
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...