我有以下代码,其中我有一个结构($node),它是一个声明的标量,但似乎是一个使用的哈希:
sub LoadData()
{
#not significant code here
my $node = {
BaseName => "deviceA",
SysDescr => "Example device",
SysObjectId => "SysObjectIdTest",
ManagementIpAddress => "BLABLABLA",
Protocol => "1",
};
$store->AddDeviceData( 1, $node->{BaseName}, $node );
}
我的问题是:正如我们在上面看到的那样声明的 $node 是散列还是标量?我的意思是,
之间有区别(就行为而言)my $hash = {
#some foo => "bar" assign here
};
和
my %hash = (
#some foo => "bar" assign here
);
和
my %hash = {
#some foo => "bar" assign here
}
PS:它表现为哈希引用,因为 AddDeviceData() 将最后一个参数限制为哈希引用。
PSS:也许它与上下文有关;分配给标量的哈希意味着分配对哈希的引用而不是哈希本身的内容,但我不太确定。
最佳答案
您提供的所有三个示例的行为都不同:
my $hash = {
foo => "bar",
};
使用单个键 foo 和值 bar 创建哈希引用,并将其分配给名为 $hash
的标量。使用 arrow operator
访问散列引用中的值(->) 后跟花括号和键名;例如$hash->{foo}; # 条码
my %hash = (
foo => "bar",
);
使用单键 foo 和值 bar 创建散列。使用花括号和键名访问散列中的值;例如$hash{foo}; # 条码
my %hash = {
foo => "bar",
}
尝试将散列引用分配给散列,实际上使匿名散列引用成为键。由于 Perl 中的所有哈希键都是字符串,因此键将类似于 'HASH(0x7f82948e1e18)'
,其值为 undef
。如果您启用了 use warnings;
(如您所愿),则在执行此行时会看到以下警告:
Reference found where even-sized list expected at test.pl line [line-number].
阅读有关 Perl 引用的文档可能会很有用:perldoc perlref
关于perl - 将散列结构分配给标量变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29493089/