Perl,帮助访问散列中的值

Perl,帮助访问散列中的值,perl,hash,Perl,Hash,我有一个散列,如果同一个子散列的值与字符串匹配,我需要访问一个值 这是我试图访问的哈希的一部分: { 'ACCOUNTINFO' => { 'ENTRY' => [ { 'Name' => 'fields_12' },

我有一个散列,如果同一个子散列的值与字符串匹配,我需要访问一个值

这是我试图访问的哈希的一部分:

{
  'ACCOUNTINFO' => {
                   'ENTRY' => [
                              {
                                'Name' => 'fields_12'
                              },
                              {
                                'Name' => 'fields_24'
                              },
                              {
                                'content' => 'Piso 12',
                                'Name' => 'TAG'
                              },
                              {
                                'Name' => 'fields_23'
                              },
                              ]
                   }
}
如果Name是“Tag”,我需要“content”的值

我可以访问以下名称:

$name = $refia->{ACCOUNTINFO}{ENTRY}{Name};
但我找不到任何方法在需要时访问内容

我已经准备好了:

if ($refia->{ACCOUNTINFO}{ENTRY}{Name} eq "TAG") {
    ###
    }

谢谢,条目指向一个数组。因此,您需要包含索引(例如,获取第一个元素):

这是一个简短的写作方式

$refia->{ACCOUNTINFO}->{ENTRY}->[0]->{Name}

条目指向一个数组。因此,您需要包含索引(例如,获取第一个元素):

这是一个简短的写作方式

$refia->{ACCOUNTINFO}->{ENTRY}->[0]->{Name}

让我们看一下括号:

{ { [ {
你有个好主意。您将需要相同的括号来取消引用它:

$refia->{...}{...}[...]{...}
或者更具体地说

$refia->{ACCOUNTINFO}{ENTRY}[$i]{Name};
但是你不知道
$i
。事实上,您需要尝试为
$i
使用许多不同的值,因此需要一个循环

for my $i (0 .. $#{ $refia->{ACCOUNTINFO}{ENTRY} }) {
   if ($refia->{ACCOUNTINFO}{ENTRY}[$i]{Name} eq 'TAG') {
      ...
   }       
}
但这有点难以理解。更好的解决方案是将焦点缩小到结构的相关部分

my $entries = $refia->{ACCOUNTINFO}{ENTRY};
for my $entry (@$entries) {
   if ($entry->{Name} eq 'TAG') {
      ...
   }       
}

让我们看一下括号:

{ { [ {
你有个好主意。您将需要相同的括号来取消引用它:

$refia->{...}{...}[...]{...}
或者更具体地说

$refia->{ACCOUNTINFO}{ENTRY}[$i]{Name};
但是你不知道
$i
。事实上,您需要尝试为
$i
使用许多不同的值,因此需要一个循环

for my $i (0 .. $#{ $refia->{ACCOUNTINFO}{ENTRY} }) {
   if ($refia->{ACCOUNTINFO}{ENTRY}[$i]{Name} eq 'TAG') {
      ...
   }       
}
但这有点难以理解。更好的解决方案是将焦点缩小到结构的相关部分

my $entries = $refia->{ACCOUNTINFO}{ENTRY};
for my $entry (@$entries) {
   if ($entry->{Name} eq 'TAG') {
      ...
   }       
}

Perl只需要一个解引用,因为其后的每一级都必须是一个引用本身。任何一种形式都可以,但第一种形式较短。Perl只需要一个解引用,因为其后的每一级都必须是引用本身。这两种形式都可以,但第一种更短。我仍然无法获得“内容”的价值。我正在尝试你写的第一个语法。我写的点在哪里:$tag=$ref->{ACCOUNTINFO}{ENTRY}[$I]{content}。但是我什么也没得到,要么你的数据结构和你说的不一样,要么你没有正确地复制代码。(我看到你的ref在一个名为
$refia
的变量中,而我的ref在
$ref
中。你解释了吗?我把答案改为使用
$refia
)如果问题确实是
$ref
$refia
相比,那么你可能没有使用
严格使用。始终使用
严格使用;使用警告!问题实际上是vas ref与refia。我在脚本中使用了这两种方法。我不能在这里使用scrict。我正在修改一个不使用它的脚本,如果我使用strict,它将不起作用。我已经尝试过解决这个问题,但是我不能
,但也添加了
我们的$foo用于任何投诉。这将为您带来
严格使用的一些好处在新代码中,而不必当场修复旧代码。//或者,您可以使用
使用strict。这是一个词汇范围的pragma,因此它只会影响您正在编写的代码。我仍然无法获得“content”的值。我正在尝试你写的第一个语法。我写的点在哪里:$tag=$ref->{ACCOUNTINFO}{ENTRY}[$I]{content}。但是我什么也没得到,要么你的数据结构和你说的不一样,要么你没有正确地复制代码。(我看到你的ref在一个名为
$refia
的变量中,而我的ref在
$ref
中。你解释了吗?我把答案改为使用
$refia
)如果问题确实是
$ref
$refia
相比,那么你可能没有使用
严格使用。始终使用
严格使用;使用警告!问题实际上是vas ref与refia。我在脚本中使用了这两种方法。我不能在这里使用scrict。我正在修改一个不使用它的脚本,如果我使用strict,它将不起作用。我已经尝试过解决这个问题,但是我不能
,但也添加了
我们的$foo用于任何投诉。这将为您带来
严格使用的一些好处在新代码中,而不必当场修复旧代码。//或者,您可以使用
使用strict。它是一个词汇范围的pragma,因此它只会影响您正在编写的代码。