typeglobs可以在Perl中用作引用的原因

时间:2012-08-24 09:17:07

标签: perl reference dereference perl-data-structures

对不起可能不是很清楚的问题,但我问它,因为我不喜欢读smth而且不明白我在读什么。

以下是“Programming Perl”的片段:

  

由于您取消引用某些内容的方式总是表示什么样的   你需要参考,可以像参考一样使用typeglob,   尽管typeglob包含多种不同类型的指示物。所以   尽管如此,$ {* main :: foo}和$ {\ $ main :: foo}都访问相同的标量变量   后者更有效率。

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

  

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

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

我检查了本书的勘误页面但没有找到任何内容。

我的假设是否正确?如果不是,那么有人会如此愉快地解释,我错了。

提前谢谢。

3 个答案:

答案 0 :(得分:15)

没有。它的含义是,与普通引用不同,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变量,因为词法变量与typeglobs无关。

旁注:“作为参考的数组”警告与此无关。它引用了这种语法:@array->[0](意思与$array[0]相同)。这从来没有打算成为有效的语法;它意外地滑入了Perl 5解析器,并且在Larry注意到之后被弃用了。

答案 1 :(得分:1)

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

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

引用始终具有严格的类型和目标。 typeglob可能只包含一个字符串,表示它应该指向某个变量(name)或文件句柄(如STDOUT)或其他一些可通过此字符串访问的值

有一些奇怪的东西可以完成一些奇怪的事情,这些只能用于类型的颜色,所以我认为即使在现代的perl中它们也很重要

答案 2 :(得分:1)

图示的PerlGuts是一种了解Perl内部的可访问方式。

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

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

PS:你想要理解是值得赞扬的 - 它将为你的未来做好准备:)