我在回顾Eric Strom先生的this question,尤其是response,并对其中更“神奇”的部分提出了疑问。请查看上下文链接的问题,因为我只是想了解这个块的内侧部分:需要帮助理解脚本的部分(球体和参考文献)
for (qw($SCALAR @ARRAY %HASH)) {
my ($sigil, $type) = /(.)(.+)/;
if (my $ref = *$glob{$type}) {
$vars{$sigil.$name} = /\$/ ? $$ref : $ref
}
}
因此,它遍历三个字,打破各分为两个瓦尔,$sigil
和$type
。 if {}
块是我不了解的。我怀疑(..)
内的部分获得了$glob{$type}
内的符号引用......必须有一些“魔术”(我还不了解的底层机制的某些深奥元素)依赖于那里来确定类型的“指向”数据?
下一行也是部分令人困惑。在我看来,我们正在分配到变量哈希,但是什么是rhs在做什么?我们在最后一次操作中没有分配到$_
(分配了$ref
),那么与/\$/
区块中的比较是什么?我的猜测是,如果我们正在处理一个标量(虽然我没有看清楚我们是怎么做的),但是我们去掉这个var并将其直接存储在散列中,否则我们就存储这个引用。
所以,只需要寻找这三行中发生的事情的一个小故事。非常感谢!
哦......我明白了。明确perl欺骗正在进行,但这是有点整洁!最后一点混淆......在原始链接答案中,变量'$ glob'存储'* main :: eval_code'的值(例如,从测试脚本的输出中复制;注意前导的'*') 。当'* $ glob {SCALAR}'被评估时,是评估(在伪代码中)'*(* main :: eval_code){SCALAR}'? * *如何解决? – Jon 2014-10-09 16:53:25
关于使用'$ a'来达到自己的目的通常的惩罚! – Borodin 2014-10-09 17:00:23
@Jon,您知道签名'''','@'和'%',也许您知道'&call_this_sub('a')'中的遗留CODE签名',井符号有一个印记也是。最不为人知的是'*',它告诉perl将其解决到系统表。 “符号”和typeglob几乎是一回事。 – Axeman 2014-10-10 17:58:51