perl哈希初始化语法

时间:2018-04-08 09:28:58

标签: perl hash initialization

我正在阅读一个perl脚本,并且有一条我不太了解的内容。

代码如下所示:

sub foo {
    package CFG;
    %hash1 = ...;
}

sub bar {
   my %hash2 = %{CFG::hash1};
}

这是我的问题:为什么%hash2被初始化为%{CFG :: hash1}而不仅仅是我的%hash2 = CFG :: hash1。这两者有什么区别?

1 个答案:

答案 0 :(得分:4)

这里有几件事情要发生。首先,来自perldata

  

将会处理在语法中没有其他解释的单词   好像它是一个带引号的字符串。这些被称为" barewords"。和。一样   文件句柄和标签,一个完全由小写字母组成的裸字   字母风险与未来的保留字冲突[...]

     

有些人可能希望完全取缔裸言。如果你说

use strict 'subs';  
     

然后任何不会被解释为子程序调用的裸字   而是产生编译时错误。

此外,如果启用warnings编译指示,如果尝试初始化具有奇数个元素的哈希,则会收到警告。来自perldiag

  

哈希分配中奇数个元素
  (W misc)你指定了一个   用于初始化散列的奇数个元素,这是奇数,因为   哈希来自键/值对。

最后,来自perlref

  

不那么象征性的参考
  围绕象征性参考的括号可以   只是用于将标识符或变量名称与其余名称隔离开来   一个表达式,就像它们总是在一个字符串中一样。对于   例如,

$push = "pop on ";  
print "${push}over";
     

总是意味着打印"弹出",即使推   是一个保留字。   这被推广为没有封闭的双重工作   引用,所以

print ${push} . "over";  
     

会产生同样的效果。这种结构不被认为是   当您使用严格的参考时,符号引用:

所以当你写:

my %hash2 = CFG::hash1;

您首先尝试初始化具有奇数个元素的哈希值,如果您启用了warnings,则会收到有关该问题的警告。其次,由于没有名称为sub的{​​{1}},后者是未定义的裸字,如果您使用了CFG::hash1编译指示,则会出现编译时错误

strict

最后,将Bareword "CFG::hash1" not allowed while "strict subs" in use 声明为%hash2%CFG::hash1是等效的。 (但请注意,使用%{CFG::hash1}您也可以编写例如%{ ... },然后我们会尝试调用名为%{ CFG::hash1() }的{​​{1}}并将其返回值用作哈希键来代替。)

结论

语法sub(或CFG::hash1())将哈希my %h1 = %h2复制到my %h1 = %{h2}。您问题中的另一种语法:%h2创建一个新哈希(如上所述,使用带有未定义值的单个键)。