perl - 将散列结构分配给标量变量

标签 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:也许它与上下文有关;分配给标量的哈希意味着分配对哈希的引用而不是哈希本身的内容,但我不太确定。

最佳答案

您提供的所有三个示例的行为都不同:

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/

相关文章:

Perl 错误,无法使用定义的 (@array)。我怎样才能解决这个问题?

MySQL 校验和冲突评估

algorithm - 在 Matlab 3D 数组中查找重复的 2D 数组

sql - 在发送到服务器之前散列密码

php - 如何在 perl 和 php 中根据日期时间比较两个字符串?

perl - Docker [for mac] 文件系统变为只读,这几乎破坏了 docker 的所有功能

Perl HTTP 后认证

algorithm - 散列中的聚类(在碰撞中)是什么意思?

ruby - 如何为哈希键分配多个值?

perl - 为多行引用的单词添加注释的最佳方法是什么?