这个数据结构是如何工作的?

4

我需要在没有太多关于Perl的知识的情况下对现有脚本进行调试。

该脚本使用以下数据类型来存储文件中的所有字段:

${$LineRefs->{FIELD_NAME}}

我一直在尝试通过迭代这个标量/哈希/数组或任何可能的方式来找到所有可能的字段,但我不知道如何操作。

请问有人可以指点我吗?


2
我可以指引你前往这个方向:http://perldoc.perl.org/ 是一个Perl语言的全面文档网站。具体来说,你需要阅读有关数据结构的内容:http://perldoc.perl.org/perldsc.html - glenn jackman
请问 ${$LineRefs->{FIELD_NAME}} 是你的示例语句吗? - Borodin
1个回答

5

这确实非常奇怪

$LineRefs 是一个哈希表的引用,其中有一个键为 FIELD_NAME 的元素,其值是一个标量的 引用

就像这样

use v5.14;

my $LineRefs = {
    FIELD_NAME => \99,
};

print ${ $LineRefs->{FIELD_NAME} }, "\n";

输出

99

哈希和数组的引用很常见,因为它们允许一个大数据结构被表示为单个标量。但是对标量的引用远不如此有用,因为它们只是将一个标量替换为另一个标量。



很抱歉,感谢@glennjackman的帮助。我匆忙阅读了问题,并假设它是关于为什么哈希元素被解引用为标量的。

我一直在尝试弄清楚如何通过迭代这个标量/哈希/数组或其他任何可能的方式来单独找到所有可能的字段,但我完全不知道该怎么做。

你正在处理一个“哈希”(hash),它类似于数组,但由字符串(键)而不是整数(索引)进行索引。

你可以使用keysvalueseach来迭代哈希。

你可以像这样打印所有的键和它们的值。由于你的变量$LineRefs是一个哈希引用,所以你需要将其解引用%$LineRefs
for my $key ( keys %$LineRefs ) {
    my $value = $LineRefs->{$key};
    print "$key => $value\n";
}

如果您的哈希值确实是标量的引用,则会看到类似于 SCALAR(0x640448) 的值被打印出来。

2
你可以使用 keys %$LineRefs 找到所有的字段 -- say for keys %$LineRefs; - glenn jackman
1
一个对此类事情非常有帮助的模块是Data::Dumper。它用于以可读形式转储Perl结构,无论它们有多么复杂。它是核心分发的一部分。尝试use Data::Dumper; print Dumper($my_strucutre); - PerlDuck
1
@glennjackman:谢谢Glenn。我忽略了问题的意图,而是专注于将标量引用作为值的奇怪性。 - Borodin
非常感谢,keys %$LineRefs 返回了我所需的内容。 - Subbeh

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