Размер переменной экземпляра хеша - PullRequest
1 голос
/ 13 августа 2010

У меня есть класс Perl, который содержит переменную экземпляра хеша для хранения других объектов.Я хотел бы иметь метод для печати количества элементов в хэше, но я получаю следующее сообщение об ошибке в строке return keys($self->{'_things'});

Тип аргумента 1 для ключей должен быть хэшхэш-элемент)

package MyClass;
use strict;

sub new {
    my ($class) = @_;
    my $self = {
        _things => undef
    };
    $self->{'_things'} = ();
    bless $self, $class;
    return $self;
}

sub get_count {
    my ( $self ) = @_;
    return keys($self->{'_things'});
}

Ответы [ 3 ]

4 голосов
/ 13 августа 2010

Использование

return scalar(keys(%{$self->{'_things'}}));

$self->{'_things'} - это просто ссылка на хеш, а keys() ожидает хеш в качестве аргумента, поэтому сначала необходимо разыменовать егооборачивая это в %{…}.Наконец, поскольку вы хотите считать элементы, вы должны убедиться, что возвращаемое значение keys() (которое является списком) интерпретируется в скалярном контексте, заключая его в scalar(…).

2 голосов
/ 13 августа 2010

Если я вас правильно понимаю, $self->{_things} должен содержать хеш-структуру данных.Если это так, у вас есть две проблемы:

sub new {
    my ($class) = @_;
    my $self = {
        # Initialize _things to be a reference to an empty hash.
        _things => {},
    };
    bless $self, $class;
    return $self;
}

sub get_count {
    my ( $self ) = @_;
    # Here's the way to get the N of keys.
    # The %{ FOO } syntax will take a hash reference (FOO in this case) and 
    # convert it to a hash, on which we can then call keys().
    return scalar keys %{ $self->{'_things'} };
}
0 голосов
/ 13 августа 2010

Сообщение об ошибке полностью правильно!;) Вам нужно «разыменовать» элемент в хеш, также вам нужно вызвать keys () в скалярном контексте, чтобы получить счетчик.

$ perl -wle 'use strict; my $href = { foo => undef }; $href->{foo} = (); print sclar keys $href->{foo}'
Type of arg 1 to keys must be hash (not hash element) at -e line 1, at EOF
Execution of -e aborted due to compilation errors.

против

$ perl -wle 'use strict; my $href = { foo => undef }; $href->{foo} = (); print scalar keys %{ $href->{foo} }'
0

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

$ perl -wle 'use strict; my $href = { foo => undef };  $href->{foo} = { bar => 1 }; print scalar keys %{ $href->{foo} };'
1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...