【问题标题】:What is the difference between {} and ->{} in Perl?Perl 中的 {} 和 ->{} 有什么区别?
【发布时间】:2020-10-15 08:15:48
【问题描述】:

所以,如果我有一些数据对象,并且我想访问该对象的元素内的内容

有什么区别

$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};

【问题讨论】:

  • 您可能需要检查the documentation
  • @GMB 我已经读过它并且很难理解其中的区别。任何帮助将不胜感激

标签: arrays perl hash reference


【解决方案1】:

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

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

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

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";
}

您可以在the perlref documentation page 中阅读有关参考的更多信息。

【讨论】:

    【解决方案2】:
    $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}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-23
      • 2011-01-18
      • 2011-01-17
      • 2021-12-06
      • 2017-05-06
      • 2010-09-12
      • 1970-01-01
      相关资源
      最近更新 更多