5

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

这是“Programming Perl”的片段:

由于您取消引用某事物的方式始终表明您正在寻找哪种类型的参照物,因此可以像使用引用一样使用 typeglob,尽管 typeglob 包含多个不同类型的参照物。所以 ${*main::foo}${\$main::foo}都访问相同的标量变量,尽管后者更有效。

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

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

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

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

我的假设正确吗?如果不是,那么有人会很乐意解释,我错了。

先感谢您。

4

3 回答 3

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变量,因为词法变量与类型团无关。

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

于 2012-08-24T09:34:46.410 回答
1

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

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

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

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

于 2012-08-24T09:33:31.190 回答
1

图示的 PerlGuts 是了解 Perl 内部结构的一种易于访问的方式。

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

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

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

于 2012-08-27T09:46:29.810 回答