【发布时间】: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