繁体   English   中英

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

[英]What is the difference between {} and ->{} in Perl?

因此,如果我有一些数据 object 并且我想访问该 object 元素内部的内容

有什么区别

$Data{isEnabled})

$Data->{isEnabled}

我的数据基本上是这样的

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

$Data->{isEnabled}

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

$Data{isEnabled})

对比

$Data->{isEnabled}

例如,为什么第一次打印工作但第二次失败?

use strict;
use warnings;


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

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

第一个表达式访问 hash 中的键:

my %data = (is_enabled => 1);
print $data{is_enabled}), "\n";

在第二个表达式中, data不是 hash,而是 *hash 引用。 它通常会被声明为:

my $data = { is_enabled => 1 };

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

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

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

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

您可以在perlref文档页面中阅读有关参考的更多信息。

$Data->{isEnabled}

相当于

${ $Data }{isEnabled}

我更喜欢“箭头”表示法,但它更适合我的解释

$Data{isEnabled}

${ $Data }{isEnabled}

在第一种情况下( $Data{isEnabled} ),我们正在访问 hash %Data的元素。

在第二种情况下,我们似乎也有一个 hash 查找,但我们有一个块( { $Data } ),通常需要一个名称。 它确实是一个 hash 查找,但我们访问的是引用的 hash,而不是访问命名的 hash。 该块(或->左侧的表达式)应返回对程序应访问的 hash 的引用。

引用是一种通过变量在 memory 中的位置而不是名称来引用变量的方法。 考虑以下示例:

my $ref;
if (condition()) {
   $ref = \%hash1;
} else {
   $ref = \%hash2;
}

say $ref->{id};

这将根据condition()是否返回真值来打印$hash1{id}$hash2{id}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM