Perl 为什么ref不返回';GLOB';?

Perl 为什么ref不返回';GLOB';?,perl,ref,filehandle,typeglob,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,“>”,\my$var; t(F); t(\F); t(*F); t(\*F); 子t{ 我的$fh=班次; 打印“>

我想更好地理解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,“>”,\my$var;
t(F);
t(\F);
t(*F);
t(\*F);
子t{
我的$fh=班次;
打印“>>$fh
  • t(F)
    :字符串[1]不是对全局的引用
  • t(\F)
    :对字符串的引用不是对全局的引用
  • t(*F)
    :glob不是对glob的引用
  • t(\*F)
    :对glob的引用就是对glob的引用

  • «语法中没有其他解释的单词将被视为带引号的字符串。这些被称为“”
  • 如果没有,没有其他含义的标识符被解释为空字,空字产生字符串。这就解释了前两行(第二行参见
    print\“F”

    globs的插值(第三行)记录在中

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


    您可以建议哪个模块转储glob?
    使用Data::dump qw/pp/;print pp\*F
    并不表明glob有{IO}A是一个C结构。一如既往,如果您想查看Perl变量的内部,请使用Devel::Peek。
    Perl-MDevel::Peek-e'dump(*STDOUT)“
    。我想你想读的是不,这不是我想要的。想看看IO对象的属性:自动刷新标志、光标、附加层等。这样它就会像哈希表一样显示出来。你说你想转储一个glob,而不是IO对象。转储glob不会递归,但你可以转储IO对象本身。
    perl-MDevel::Peek-e'Dump(*STDOUT{IO})
    。没有光标(位于操作系统端),可以使用
    PerlIO::get_layers
    显示层。
    >>F<<
    >>SCALAR(0x1e67fc8)<<SCALAR
    >>*main::F<<
    >>GLOB(0x1e53150)<<GLOB