Как сделать члена класса хэшем в Perl? - PullRequest
4 голосов
/ 31 августа 2010

Я пытаюсь написать пакет на Perl.Мне нужен один из членов, чтобы быть хешем.Однако, когда я ссылаюсь и запускаю программу, я не могу заставить ее работать с обычным синтаксисом.Если у меня есть:

sub new
{
my $class = shift;
my $self = {
    textfile => shift,
    placeholders => ()
};
bless $self, $class;
return $self;
}

Есть ли способ сделать "заполнители" хэшем, к которым я могу получить доступ через $ self -> {placeholder}?

Спасибо

Ответы [ 4 ]

10 голосов
/ 31 августа 2010

Да, но вы должны сделать это ссылкой на хеш .

$self = {
   textfile => shift,
   placeholders => { }         #  { }, not ( )
};
...


$self->{placeholders}->{$key} = $value;
delete $self->{placeholders}->{$key};
@keys = keys %{$self->{placeholders}};
foreach my ($k,$v) each %{$self->{placeholders}} { ... }
...
6 голосов
/ 31 августа 2010

Все члены агрегатов (массивы, хэши и объекты, являющиеся массивами, являются хэшем) являются скалярами.Это означает, что элемент в хэше никогда не является другим массивом или хэшем, но это может быть массив или хеш ссылка .

Вы хотите сделать (в первом приближении):

sub new {
  my $class = shift;
  my ($textfile) = @_;
  my $self = {
    textfile => $textfile,
    placeholder => {},
  };
  return bless $self, $class;
}

А затем, когда вы используете его (при условии, что у вас также есть placeholder аксессор), вы можете использовать $obj->placeholder->{key}, %{ $obj->placeholder } и т. Д.

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

Вы хотите ссылку на хеш.Используйте фигурные скобки вместо скобок:

sub new { 
     my $class = shift; 
     bless { textfile => shift, placeholders => {} }, $class; 
     }
4 голосов
/ 31 августа 2010

() создает пустой список.Это нормально, когда вы присваиваете %hash, но в противном случае Perl просто обрабатывает его как пустой список, который сливается в окружающий список.Как и при назначении на $self, вам нужно использовать фигурные скобки { } для создания анонимной ссылки на хеш.

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