【问题标题】:Unable to get value from a nested Perl Hash Structure [closed]无法从嵌套的 Perl 哈希结构中获取值 [关闭]
【发布时间】:2021-10-21 17:35:09
【问题描述】:

我已经在互联网上搜索了指导,并且已经为此工作了好几天,但无法理解数据结构。我也有一个带有嵌套数组的多级哈希结构。它看起来像这样

{'Suggestion' => {
     'Car' => {'Make' => ['Toyota'] }, 
     'Bike' => 'Giant', 
     'Motorcycle' => {'Make'=> ['BMW']}
};

我可以将ToyotaBMW 提取到带有{"Suggestion"}->{"Car"}->{"Make"} and {"Suggestion"}->{"Motorcycle"}->{"Make"} 的字符串变量中。

当我尝试使用{"Suggestion"}->{"Bike"} 提取Giant 时,它给了我一个作为字符串(HASH(9879)) 的HASH 引用。当我使用Dumper({"Suggestion"}->{"Bike"}) 时,它给了我$VAR = {'Bike' => undef};。那么它是一个带有键和 undef 值的 Hash 吗?

然后,如果我尝试使用%({"Suggestion"}->{'Bike'}) 来尊重它,它会给我一个错误:

Can't use string ("Bike") as a HASH ref while "strict refs" in use at (eval 7552). So this is telling me that I'm trying to use a string that I want as a hash ref? 

我做错了什么?

【问题讨论】:

  • 你的 hashref 在变量中吗?
  • 没有。我在循环中使用它,如上所示,通过使用 join() 创建一个长字符串。
  • 在您的代码中print Dumper($var) 并发布输出,其中$var 包含Suggestion。注意:posted in 消息结构有不平衡的大括号。
  • 那我完全不明白你为什么有一个 hashref。请显示更多代码。
  • 您在上面显示的内容很好,并且工作正常。您的实际代码中一定有 something 不同吗?你能发布一个失败的最小可运行示例吗?

标签: arrays perl hash


【解决方案1】:

OP提供的示例代码不完整,大括号不平衡。

下面的代码sn-p演示,如果数据结构完整,应该没有任何错误。

use strict;
use warnings;
use feature 'say';

use Data::Dumper;

my $data = {
    'Suggestion' => {
         'Car' => {'Make' => ['Toyota'] },
         'Bike' => 'Giant',
         'Motorcycle' => {'Make'=> ['BMW']}
    }
};

say Dumper($data);

say 'Bike: ' . $data->{Suggestion}{Bike};

输出

$VAR1 = {
          'Suggestion' => {
                            'Bike' => 'Giant',
                            'Car' => {
                                       'Make' => [
                                                   'Toyota'
                                                 ]
                                     },
                            'Motorcycle' => {
                                              'Make' => [
                                                          'BMW'
                                                        ]
                                            }
                          }
        };

Bike: Giant

生成多行字符串的示例

my $trafficStr = "
Bike:       $Transport->{"Suggestion"}{"Bike"}
Car:        $Transport->{"Suggestion"}{"Car"}{"Make"}[0]
Motorcycle: $Transport->{"Suggestion"}{"Motorcycle"}{"Make"}[0]
";

【讨论】:

  • 感谢平衡支架。这是一个错字。
  • @user2127579 为避免这种情况,请使用“复制+粘贴”方法来最大程度地减少错误。
【解决方案2】:

我将数据结构作为输入。 $交通

这是我正在使用的代码 sn-p 并且是最终正确答案:

my $trafficStr = "";
$trafficStr .= "Bike: " . $Transport->{"Suggestion"}->{"Bike"} . "\n";
$trafficStr .= "Car: " . join(',' , @{$Transport->{"Suggestion"}->{"Car"}->{"Make"}}) . "\n" ;
$trafficStr .= "Motorcycle: " . join(',' , @{$Transport->{"Suggestion"}->{"Motorcycle"}->{"Make"}}) . "\n";
return $trafficStr;`

这将返回:

Bike: Giant
Car: Toyota
Motorcycle: BMW

这些是获取Giant错误方法。

$trafficStr .= "Bike: " . join(',' , %{$Transport->{"Suggestion"}->{"Bike"}}) . "\n";
Commit failed: Can't use string ("Giant") as a HASH ref while "strict refs" in use at (eval 7552)
$trafficStr .= "Bike: " . join(',' , Dumper({$Transport->{"Suggestion"}->{"Bike"}})) . "\n";
Bike: $VAR1 = {'Bike'=>Undef}
$trafficStr .= "Bike: " . join(',' , $Transport->{"Suggestion"}->{"Bike"}) . "\n";
Bike: HASH(0x9f35c98)

【讨论】:

  • 您应该使用不起作用的实际代码来编辑您的问题。否则,这个答案对除了你以外的任何人都是毫无价值的。
  • 嗯,如果你知道数组只有一个元素,为什么还要使用join()?您可以改用数组索引$Transport->{"Suggestion"}{"Car"}{"Make"}[0]。我看不出一辆汽车怎么会有多个制造商(如果你不打算包括组装汽车的每个零部件制造商的话)。
  • 注意:构建$trafficStr 的方式是把代码弄得乱七八糟,很难阅读。相反,您可以执行 `my $trafficStr = "some line1(Enter) some line2(Enter)some line3" 。 {代码} 。 “[输入]某行 3 [输入]”。这样,它看起来就像会打印带有存储值的替换变量,并允许嵌入一段代码,该代码会产生一些字符串。尝试只是为了实验,也许你永远不会回到旧方法。
  • 请参阅我的答案的底部,演示如何构建多行字符串变量。
猜你喜欢
  • 2017-04-16
  • 2016-06-13
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多