我正在尝试用perl编写一个包。我需要其中一个成员成为哈希。但是,当我引用并运行程序时,我无法使用通常的语法。如果我有:
sub new
{
my $class = shift;
my $self = {
textfile => shift,
placeholders => ()
};
bless $self, $class;
return $self;
}
有没有办法让“占位符”成为我可以通过$ self-> {placeholders}访问的哈希?
由于
答案 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;
}