如果我写入像 \*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/

10-10 14:36