如何在Perl中将类的成员变量转换为哈希?

4

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

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

有没有办法将“占位符”变成一个哈希,我可以通过 $self->{placeholders} 访问它?
谢谢。

相关链接:https://dev59.com/8XA65IYBdhLWcg3w5y_B。 - FMc
4个回答

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}} { ... }
...

它可以运行!非常感谢!我应该自己想到的。再次感谢! - Feynman
如果mobrule的回答解决了你的问题,随意接受它 :) - brian d foy
这里有太多正确的答案了。这展示了我们在一天结束时都在做什么... :) - Eric Strom

6
所有聚合成员(数组,哈希和对象,它们是数组或哈希)都是标量。这意味着哈希中的项永远不是另一个数组或哈希,但它可以是一个数组或哈希引用
你想要做的事情(第一次近似):
sub new {
  my $class = shift;
  my ($textfile) = @_;
  my $self = {
    textfile => $textfile,
    placeholder => {},
  };
  return bless $self, $class;
}

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


4

您需要一个哈希引用。请使用大括号而不是圆括号:

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

4

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接