【问题标题】:The reason why typeglobs can be used as a reference in Perl在 Perl 中 typeglobs 可以作为参考的原因
【发布时间】:2012-08-19 20:15:28
【问题描述】:

抱歉,这个问题可能不是很清楚,但我是在问这个问题,因为我不喜欢在不了解我正在阅读的内容的情况下阅读。

这是“Programming Perl”中的sn-p

因为你取消引用某事物的方式总是表明是哪种 您正在寻找的引用对象,可以像引用一样使用 typeglob, 尽管 typeglob 包含多个不同类型的引用。所以 ${*main::foo}${\$main::foo} 都访问同一个标量变量,尽管 后者效率更高。

对我来说,这似乎是错误的,如果是这样的话,那就对了:

您可以使用 typeglob 代替标量变量,因为引用始终是标量,编译器知道您需要什么。

从本书的正文中,读者可以假设引用可以不是标量变量(即符号表中的标量条目)。 一旦我看到一个警告:use of array as a reference is deprecated,所以在我看来,很久以前“Programming Perl”中的这一段是有意义的,因为引用不仅可以是标量,而且在新的第 4 版中它根本没有改变以符合使用现代 Perl。

我检查了这本书的勘误页,但一无所获。

我的假设正确吗?如果不是,那我错在哪里,会很愉快地解释一下。

提前谢谢你。

【问题讨论】:

    标签: perl reference dereference perl-data-structures


    【解决方案1】:

    图示的 PerlGuts 是一种了解 Perl 内部结构的便捷方式。

    http://www.cpan.org/authors/id/GAAS/illguts-0.09.pdf

    到目前为止给出的答案只是说明了正在发生的事情,但是学习 perl 如何存储变量会让您看到答案实际上非常简单,类比实际上不如实现清晰。

    PS:你想要理解是值得称道的——它会让你对未来有好处:)

    【讨论】:

    • 链接断开。 :(
    【解决方案2】:

    没有。它的意思是,与普通引用不同,typeglob 同时包含多种类型的事物。但是您取消引用它的方式表明您想要哪种类型的东西:

    use strict;
    use warnings;
    use 5.010;
    
    our $foo = 'scalar';
    our @foo = qw(array of strings);
    our %foo = (key => 'value');
    
    say ${ *foo };                  # prints "scalar"
    say ${ *foo }[0];               # prints "array"
    say ${ *foo }{key};             # prints "value"
    

    您不需要特殊的“typeglob 解引用语法”,因为正常的 取消引用语法已经指示您要取消引用 typeglob 的哪个槽。

    请注意,这不适用于 my 变量,因为词法变量与类型团无关。

    旁注:“数组作为参考”警告与此无关。它指的是这样的语法:@array->[0](含义与$array[0] 相同)。那从来都不是有效的语法;它意外地滑入 Perl 5 解析器,并在 Larry 发现后被弃用。

    【讨论】:

    • 我应该读成But the way in which you dereference it indicates which type of reference will be created implicitly吗?
    • @caligula,不,因为您没有创建参考。 typeglob 已经是一种引用。您只是选择要取消引用其中的哪个插槽。
    【解决方案3】:

    虽然这不能完全回答你的问题,但我可以试着告诉你我对 typeglobs 的体验

    它们比标量和引用更具动态性,因为使用 typeglob 有点像告诉编译器“这里有一个提示,你自己猜猜你要用它做什么”

    引用总是有严格的类型和目标。 typeglob 可能只包含一个字符串,表明它应该指向某个变量(名称)或文件句柄(如 STDOUT)或其他值,可以通过该字符串访问

    有一些 perlish hack 可以完成一些奇怪的事情,这些事情只有 typeglobs 才有可能,所以我认为即使在现代 perl 中它们也很重要

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-28
      • 1970-01-01
      • 2013-06-05
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多