3

我想更好地理解 typeglobs 并编写小程序:

use Symbol;

open F, '>', \my $var;
t( F );
t( \F );
t( *F );
t( \*F );
sub t {
   my $fh =  shift;
   print ">>$fh<<" . ref( $fh ) ."\n";
}

输出是:

>>F<<
>>SCALAR(0x1e67fc8)<<SCALAR
>>*main::F<<
>>GLOB(0x1e53150)<<GLOB

为什么只在最后一种情况下返回GLOB ?

4

2 回答 2

8
  • t( F ): 字符串[1]不是对 glob 的引用。
  • t( \F ): 对字符串的引用不是对 glob 的引用。
  • t( *F ): glob 不是对 glob 的引用。
  • t( \*F ): 对 glob 的引用就是对 glob 的引用。

  1. «在语法中没有其他解释的单词将被视为带引号的字符串。这些被称为“裸词”。»
于 2015-10-01T12:55:26.077 回答
4

没有strict,没有其他含义的标识符被解释为裸词,而裸词产生字符串。这解释了前两行(参见print \"F"第二行)。

glob的插值(第 3 行)记录在perlref中。

*foo{NAME}并且*foo{PACKAGE}是例外,因为它们返回字符串,而不是引用。这些返回 typeglob 本身的包和名称,而不是已分配给它的名称。因此,在用作字符串之后*foo=*Foo::bar*foo将变为,但将继续分别产生和。"*Foo::bar"*foo{PACKAGE}*foo{NAME}"main""foo"

于 2015-10-01T12:57:58.707 回答