2010-08-13 2 views
1

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

Тип арг 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'}); 
} 

ответ

4

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

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

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

0

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

$ 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 

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

$ perl -wle 'use strict; my $href = { foo => undef }; $href->{foo} = { bar => 1 }; print scalar keys %{ $href->{foo} };' 
1 
2

Если вы правильно поняли, $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'} }; 
} 
Смежные вопросы