如何在Perl中使类的成员成为哈希?

时间:2010-08-30 21:38:57

标签: perl class hash object

我正在尝试用perl编写一个包。我需要其中一个成员成为哈希。但是,当我引用并运行程序时,我无法使用通常的语法。如果我有:

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

有没有办法让“占位符”成为我可以通过$ self-> {placeholders}访问的哈希?

由于

4 个答案:

答案 0 :(得分:10)

是的,但您必须将其设为哈希引用

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


$self->{placeholders}->{$key} = $value;
delete $self->{placeholders}->{$key};
@keys = keys %{$self->{placeholders}};
foreach my ($k,$v) each %{$self->{placeholders}} { ... }
...

答案 1 :(得分:6)

聚合的所有成员(数组,哈希和作为数组的对象都是哈希)都是标量。这意味着散列中的项永远不是另一个数组或散列,但它可以是数组或散列引用

你想做(第一次近似):

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

然后当您使用它时(假设您还有placeholder访问者),您可以使用$obj->placeholder->{key}%{ $obj->placeholder }等。

答案 2 :(得分:4)

()构造一个空列表。当您分配给%hash时,这很好,但除此之外,Perl只会将其视为一个空列表,并将其合并到周围列表中。就像分配到$self时一样,您需要使用花括号{ }来构造匿名哈希引用。

答案 3 :(得分:4)

您需要哈希引用。使用花括号而不是括号:

sub new { 
     my $class = shift; 
     bless { textfile => shift, placeholders => {} }, $class; 
     }