我正在阅读一个perl脚本,并且有一条我不太了解的内容。
代码如下所示:
sub foo {
package CFG;
%hash1 = ...;
}
sub bar {
my %hash2 = %{CFG::hash1};
}
这是我的问题:为什么%hash2被初始化为%{CFG :: hash1}而不仅仅是我的%hash2 = CFG :: hash1。这两者有什么区别?
答案 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
创建一个新哈希(如上所述,使用带有未定义值的单个键)。