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

use*_*860 5 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.

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

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

先感谢您.

cjm*_*cjm 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"
Run Code Online (Sandbox Code Playgroud)

您不需要特殊的"typeglob解除引用语法",因为正常的解除引用语法已经指示要取消引用的typeglob的哪个插槽.

请注意,这不适用于my变量,因为词法变量与typeglobs无关.

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

  • @caligula,不,因为你没有创建参考.typeglob已经是一种参考.您只需选择其中的哪个插槽即可取消引用. (2认同)