perl - 如何与具有哈希属性的 Perl 对象交互?

标签 perl hash object

我有一个包含多个变量的类,其中一个是散列(_runs):

sub new
{
    my ($class, $name) = @_;
    my $self = {
        _name => $name,
        ...
        _runs => (),
        _times => [],
        ...
    };
    bless ($self, $class);
    return $self;
}

现在,我要做的就是创建一个访问器/修改器,以及另一个将新数据推送到哈希中的子例程。但是我有一段时间让所有引用/取消引用/$self 调用一起工作。我已经被“不能使用字符串(“blah”)作为 HASH ref 等”错误烧伤了我的眼睛。

对于访问者,返回哈希的“最佳实践”是什么?我应该使用这些选项中的哪一个(如果有)?:
return $self->{_runs};
return %{ $self->{_runs} };
return \$self->{_runs};

此外,当我在类中的其他子例程中使用散列时,我使用什么语法来复制它?
my @runs = $self->{_runs};
my @runs = %{ $self->{_runs} };
my @runs = $%{ $self->{_runs} };
my @runs = $$self->{_runs};

迭代键也是如此:
foreach my $dt (keys $self->{_runs})
foreach my $dt (keys %{ $self->{_runs} })

实际添加数据怎么样?
$self->{_runs}{$dt} = $duration;
%{ $self->{_runs} }{$dt} = $duration;
$$self->{_runs}{$dt} = $duration;

你明白了。我一直在阅读关于使用类的文章,以及关于引用和取消引用的文章,但我似乎无法让我的大脑将知识结合起来并同时使用两者。我的 _times 数组终于可以工作了,但是将我的数组语法模仿为哈希没有用。

最佳答案

您正在对象中存储对数组或散列的引用。要将它们与标准函数一起使用,您需要取消引用它们。例如:

@{ $self->{_array_ref_key} }; 
%{ $self->{_hash_ref_key} };

如果需要将参数传递给标准函数:
push( @{ $self->{_array_ref_key} }, $some_value );
for my $hash_key ( keys %{ $self->{_hash_ref_key} }) {
    $self->{_hash_ref_key}{$hash_key}; ## you can access hash value by reference
}

此外 $self->{_hash_ref_key}{$hash_key} 语法是 $self->{_hash_ref_key}->{$hash_key} 的快捷方式(如果您第一次看到它,这很有意义)。

也看看 corresponding manual page

关于perl - 如何与具有哈希属性的 Perl 对象交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2914183/

相关文章:

perl - 如何让perl网络爬虫像wget一样进行 'breadth first'检索?

胖箭头函数中的 Javascript 引用函数,或如何每 X 秒触发一次函数

perl - 使用 Getopt::Long 时出现错误 "panic: attempt to copy freed scalar"

regex - 如何在 Perl 中用正则表达式 grep 字符串?

java - pHash 开源感知哈希库有哪些替代方案?

java - java中引用哈希值的最佳内存模型是什么?

javascript - jQuery读取.txt文件但抓取特定数据

php - 如何使用zend框架转换json数据中的对象?

Perl 以最有效的方式在重复模式上拆分字符串?

java - 如何将大字符串转换为十六进制,然后再转换为字节?