将哈希结构分配给标量变量

时间:2015-04-07 13:43:28

标签: perl hash

我有以下代码,其中我有一个结构($ 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:也许它有与上下文相关的东西;分配给标量的散列意味着分配对散列的引用而不是散列本身的内容,但我不太确定。

3 个答案:

答案 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}