如果我写入像 \*STDOUT
这样的真实引用而不是像 *STDOUT
这样的 typeglob,我会得到什么?
最佳答案
一个是 typeglob ,另一个是对它的引用。
据我所知,主要的实际区别是你 不能祝福 typeglob 到一个对象中,但你可以祝福 typeglob 引用 (这就是 IO::Handle
所做的)
在“Perl Cookbook”(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";
产生:
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.
作为旁注,有传言称 typeglob 引用是将文件句柄传递给函数的唯一方法,但事实并非如此:
sub pfh { my $fh = $_[0]; print $fh $_[1]; }
pfh(*STDOUT, "t1\n");
pfh(\*STDOUT, "t2\n");
# Output:
# t1
# t2
关于Perl typeglobs 和 Real References : What do I gain if I write to\*STDOUT instead of *STDOUT?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10477797/