Как я могу определить пустой массив в Perl Construtor? - PullRequest
4 голосов
/ 25 апреля 2010

Я только начинающий с Perl, так что если это звучит глупо - извините за это:)

Моя проблема в том, что я пытаюсь написать класс с пустым массивом, определенным в конструкторе класса. Итак, я делаю это так:

package MyClass;

use strict;

sub new {
    my ($C) = @_;
    my $self = {
        items => ()
    };
    bless $self, ref $C || $C;
}

sub get {
    return $_[0]->{items};
}

1;

Позже я тестирую свой класс простым скриптом:

use strict;
use Data::Dumper;
use MyClass;

my $o = MyClass->new();
my @items = $o->get();

print "length = ", scalar(@items), "\n", Dumper(@items);

И при запуске скрипта я получаю следующее:

$ perl my_test.pl 
length = 1
$VAR1 = undef;

Почему я делаю неправильно, почему я получаю массив items, заполненный undef?

Может быть, кто-то может показать мне пример того, как должен быть определен класс, чтобы я не получил никаких значений по умолчанию в моем массиве?

1 Ответ

10 голосов
/ 25 апреля 2010

Конструктор ссылок анонимного массива - [], а не (), который используется для группировки операторов в списки. () в этом случае сводится к пустому списку и Perl видит my $self = { item => };. Если бы вы работали с use warnings;, вы бы получили сообщение об этом.

Кроме того, в вашей подпрограмме get вы, вероятно, захотите разыменовать поле, чтобы вернуть список вместо ссылки на массив:

sub get {
    return @{ $_[0]->{items} };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...