我有以下代码,其中我有一个结构($ 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:也许它有与上下文相关的东西;分配给标量的散列意味着分配对散列的引用而不是散列本身的内容,但我不太确定。答案 0 :(得分:4)
您提供的所有三个示例都表现不同:
my $hash = {
foo => "bar",
};
使用单个键foo和值栏创建哈希引用,并将其分配给名为$hash
的标量。通过使用arrow operator
( - >)后跟花括号和键的名称来访问哈希引用中的值。例如$hash->{foo}; # bar
my %hash = (
foo => "bar",
);
使用单键foo和值栏创建哈希。使用花括号和键的名称访问哈希值;例如$hash{foo}; # bar
my %hash = {
foo => "bar",
}
尝试将哈希引用分配给哈希,有效地使匿名哈希引用成为密钥。由于Perl中的所有哈希键都是字符串,因此密钥类似于'HASH(0x7f82948e1e18)'
,其值为undef
。如果您启用了use warnings;
(如您所愿),执行此行时会看到以下警告:
参考文献找到了test.pl行[line-number]预期的偶数大小列表。
阅读Perl参考文档可能很有用:perldoc perlref
答案 1 :(得分:1)
{ key => value }
语法是匿名哈希引用构造函数。引用是标量(它们基本上是花哨的指针),因此它被分配给标量变量的原因。正如您在指向的代码示例中所注意到的,要获取底层哈希中的数据,您需要使用解除引用运算符->
。要获取整个底层哈希,可以使用%$node
。
有关Perl参考的温和介绍,请参阅Perl References Tutorial。
答案 2 :(得分:1)
我的意思是,
之间是否存在差异(就行为而言)my $hash = { #some foo => "bar" assign here };
和
my %hash = ( #some foo => "bar" assign here );
和
my %hash = { #some foo => "bar" assign here }
my %hash
创建一个名为lexical hash 的,可以单独或在声明中使用偶数编号的键/值对列表进行初始化。每个键必须是一个简单的字符串,并且每个值都表现为Perl标量变量
{ ... }
构造根据上下文创建匿名哈希,并计算对该哈希的引用 - 可以分配给标量变量的标量值。大括号可能包含偶数编号的键/值对列表,用于初始化匿名散列中的数据
陈述my %hash = { foo => "bar" }
是一种误解。 my %hash
创建一个命名哈希,如上面的第一个实例,而{ foo => "bar" }
创建另一个匿名哈希,如第二种情况。匿名哈希引用形成单元素列表,并进行字符串化以创建%hash
元素的键。为缺失值提供值undef
。它类似于
my %anon = ( foo => 'bar' );
my %hash - (\%anon, undef);
但由于字符串化,密钥类似HASH(0x633444)
,不能用于访问%anon
可以通过两种方式访问匿名哈希的元素。例如,给定
my $href = { foo => 'bar' }
老式的方法是使用引用,就好像它是一个哈希名称
$$href{foo}
或者,相同但更清晰
${$href}{foo}
或者有一个较新的箭头解除引用运算符,其工作方式与C语言相同,通常是首选的
$href->{foo}