Perl中的{}和->{}有什么区别?

3

如果我有一个数据对象,想要访问该对象元素内部的内容:

以下两者有何区别:

$Data{isEnabled})

$Data->{isEnabled}

我的数据基本上是这样的

for my $characterData (@{$AllCharacters->{'characters'}}) {
$Data{isEnabled})

$Data->{isEnabled}

我想访问我的characterData的某些元素,但不确定何时使用它们。

$Data{isEnabled})

vs

$Data->{isEnabled}

例如,为什么第一个打印有效,而第二个失败?
use strict;
use warnings;


my %info = (NAME => "John", HOST => "Local", PORT => 80);

print $info{PORT};
print $info->{PORT};

2
你可能想要查看文档 - GMB
@GMB 我已经阅读了它,但是我很难理解其中的区别。如果有帮助,将不胜感激。 - user12530264
2个回答

2
第一个表达式访问散列表中的一个键:
my %data = (is_enabled => 1);
print $data{is_enabled}), "\n";

在第二个表达式中,data不是哈希,而是*哈希引用。通常它会被声明为:
my $data = { is_enabled => 1 };

由于这是一个参考,我们需要使用解引用运算符(->)来访问哈希内容:

print $data->{is_enabled}, "\n";

如果您正在遍历哈希数组,就像您的代码所展示的那样,那么每个元素都是一个哈希引用。您需要使用第二种语法:

my @all_data = ( { is_enabled => 1 }, { is_enabled => 0 } );
for my $data (@all_data) {
    print $data->{is_enabled}, "\n";
}

你可以在perlref文档页中了解更多关于引用的内容。

1
$Data->{isEnabled}

等同于

${ $Data }{isEnabled}

我更喜欢“箭头”符号,但为了更好地解释,比较一下会更有帮助。
$Data{isEnabled}

使用

${ $Data }{isEnabled}

在第一种情况下($Data{isEnabled}),我们正在访问哈希表%Data的一个元素。
在第二种情况下,我们似乎也有一个哈希表查找,但是我们有一个块({ $Data }),而不是通常期望的名称。它确实是一个哈希表查找,但是我们访问的是引用哈希表,而不是访问命名的哈希表。程序应该访问的哈希表的引用应该返回到左侧的块(或箭头->左边的表达式)。
引用是通过变量在内存中的位置而不是通过其名称来引用变量的一种方式。考虑以下示例:
my $ref;
if (condition()) {
   $ref = \%hash1;
} else {
   $ref = \%hash2;
}

say $ref->{id};

根据condition()的返回值,将打印$hash1{id}$hash2{id}


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