Perl typeglobs和Real References:如果我写入\*STDOUT而不是*STDOUT,我会得到什么?

sid*_*com 4 perl

如果我写一个真正的引用\*STDOUT而不是类似的类型,我会得到什么*STDOUT

DVK*_*DVK 8

一个是typeglob,另一个是对它的引用.

据我所知,主要的实际区别在于你不能将一个typeglob祝福成一个对象,但你可以祝福typeglob引用(这是做什么的IO::Handle)

在"Perl Cookbook",Recipe 7.16中详细讨论了这种区别."在变量中存储文件句柄".


另一个区别是,分配一个glob会为ENTIRE glob创建一个别名,而分配一个glob引用会产生预期的(如下所述perldoc perlmod, "Symbol Tables" section.

@STDOUT=(5);
$globcopy1 = *STDOUT; # globcopy1 is aliased to the entire STDOUT glob, 
                      # including alias to array @STDOUT
$globcopy2 = \*STDOUT; # globcopy2 merely stores a reference to a glob, 
                       # and doesn't have anything to do with @STDOUT

print $globcopy1 "TEST print to globcopy1/STDOUT as filehandle\n";
print "TEST print of globcopy1/STDOUT as array: $globcopy1->[0]\n\n";
print $globcopy2 "TEST print to globcopy2/STDOUT as filehandle\n";
print "TEST print of globcopy2/STDOUT as array: $globcopy2->[0]\n\n";
Run Code Online (Sandbox Code Playgroud)

生产:

TEST print to globcopy1/STDOUT as filehandle
TEST print of globcopy1/STDOUT as array: 5

TEST print to globcopy2/STDOUT as filehandle
Not an ARRAY reference at line 8.
Run Code Online (Sandbox Code Playgroud)

作为旁注,有关typeglob引用是将文件句柄传递给函数的唯一方法的谣言不是这样的:

sub pfh { my $fh = $_[0]; print $fh $_[1]; }

pfh(*STDOUT, "t1\n");
pfh(\*STDOUT, "t2\n");

# Output:
# t1
# t2
Run Code Online (Sandbox Code Playgroud)