【问题标题】:what is the best way to assign a value inside a nested hash?在嵌套哈希中分配值的最佳方法是什么?
【发布时间】:2021-07-30 02:02:25
【问题描述】:

我的代码构造了一个散列%oprAtnNOW,其中包含一个散列引用,其中包含键和值 $oprAtnNOW{opt} 在运行时确定。

下面的示例代码演示了单个命令足以提取来自$oprAtnNOW{opt} 引用的匿名哈希值。

但是分配一个值并不是这样工作的。 当我尝试将字符串wolf 分配给键Dog 时,会发生一些非常奇怪的事情。 当我使用Dumper 查看结果时,分配的值似乎是'wolf,在字符串的开头粘贴了一个单引号; 当我用print 看时,它看起来像SCALAR(something)

(我的代码末尾表明'wolf 不会打印为SCALAR(something),因此Dumper 有其他想法。)

所以我的示例代码包含一个解决方法: 尊重匿名内部哈希;在现在命名的临时哈希中分配键和值;破坏以前的$oprAtnNOW{opt} 引用临时的命名散列。

为什么直接方法会产生如此奇怪的结果?

SCALAR这件事的真实内容是什么?

有没有办法用一个命令来做到这一点,而无需我的多步骤解决方法?

#!/usr/bin/perl
use strict; use warnings;
use Data::Dumper qw(Dumper);
$Data::Dumper::Sortkeys = 1;

my %oprAtnNOW; 
${$oprAtnNOW{opt}{Dog}} = 'wolf'; 
print Dumper {%oprAtnNOW};
print join('', '$oprAtnNOW{opt}{Dog}==', $oprAtnNOW{opt}{Dog}, "\n",);

{
    my %tmp_oprAtnNOW_opt = %{$oprAtnNOW{opt}} if(defined $oprAtnNOW{opt});
    $tmp_oprAtnNOW_opt{Dog} = 'wolf'; # will clobber any previous value for Dog
    $oprAtnNOW{opt} = {%tmp_oprAtnNOW_opt};
}

print Dumper {%oprAtnNOW};
print join('', '$oprAtnNOW{opt}{Dog}==', $oprAtnNOW{opt}{Dog}, "\n",);

my $teststring = join('', "\x27", 'wolf',);
print "teststring==$teststring\n";


【问题讨论】:

  • $oprAtnNOW{opt}->{Dog} = 'wolf'$oprAtnNOW{opt}{Dog} = 'wolf,或者如果您坚持使用不必要的大括号,${$oprAtnNOW{opt}}{Dog} = 'wolf'
  • 是的,你在滥用引用,你需要阅读perldoc.perl.org/perlref来理解一些事情。当您从 Dumper 中看到 \'wolf' 时,这意味着您没有创建字符串,而是创建了对字符串的引用。另外,不确定print Dumper {%oprAtnNOW}; 是如何为您工作的,应该是print Dumper(\%oprAtnNOW);

标签: perl hash nested dereference


【解决方案1】:

你想要

$oprAtnNOW{opt}{Dog} = 'wolf';

$BLOCK = EXPR; 期望 BLOCK 返回对标量的引用。

多亏了自动激活功能,如果需要,系统会为您创建一个。换句话说,

${$oprAtnNOW{opt}{Dog}} = 'wolf';

简称

${ $oprAtnNOW{opt}{Dog} //= \my $anon } = 'wolf';

也可以写成

my $anon = 'wolf';
$oprAtnNOW{opt}{Dog} = \$anon;

这不是你想要的。您不想分配对哈希的引用;你想分配字符串wolf。为此,您可以使用

$oprAtnNOW{opt}{Dog} = 'wolf';

这个缩写

$oprAtnNOW{opt}->{Dog} = 'wolf';

又名

${ $oprAtnNOW{opt} }{Dog} = 'wolf';

后者的形式是

$BLOCK{Dog} = 'wolf';

$NAME{Dog} 一样,是对哈希元素的赋值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 2010-10-21
    • 2021-03-26
    • 1970-01-01
    • 2011-11-22
    • 2013-12-06
    • 2012-06-23
    相关资源
    最近更新 更多