为什么ref不返回' GLOB&#39 ;?

时间:2015-10-01 12:39:35

标签: perl ref filehandle typeglob

我想更好地理解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 仅在最后一种情况下被返回?

2 个答案:

答案 0 :(得分:8)

  • t( F ):字符串 [1] 不是对glob的引用。
  • t( \F ):对字符串的引用不是对glob的引用。
  • t( *F ):glob不是对glob的引用。
  • t( \*F ):对glob的引用是对glob的引用。
  1. «语法中没有其他解释的单词将被视为带引号的字符串。这些被称为“barewords”。»

答案 1 :(得分:4)

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

perlref中记录了globs的插值(第3行)。

  

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