如果我写到像\*STDOUT这样的真实引用而不是像*STDOUT这样的typeglob,我会得到什么
发布于 2012-05-07 15:10:39
一个是typeglob,另一个是对它的引用。
据我所知,主要的实际区别是您不能将typeglob引用到对象中,但您可以使用typeglob引用(这就是IO::Handle所做的)
在"Perl Cookbook",配方7.16中详细讨论了这种区别。“将文件句柄存储在变量中”。
另一个不同之处在于,分配一个glob会为整个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发布于 2012-05-07 15:06:17
*表示一个typeglob,它是符号表中的一个条目。例如:
my $x;
print *x;将产生*main::x。
\表示引用。试试这个:
use YAML::XS;
print Dump *STDOUT;
print Dump \*STDOUT;第一个是glob,第二个是引用。大概当你这样做的时候:
my $fh = *STDOUT;您实际上是在将glob复制到一个新条目中,尽管我不认为这是非常有意义的--如果现在执行close STDOUT,$fh也将关闭。这一点:
my $fh = \*STDOUT;只是一个参考,这是首选的。另请参阅:
http://perldoc.perl.org/perldata.html#Typeglobs-and-Filehandles
发布于 2012-05-07 15:03:19
您将获得一个名为STDOUT的typeglob引用。参见perlref。
这是它在这上面写的:
不可能使用反斜杠操作符创建对IO句柄(文件句柄或目录句柄)的真正引用。您最多只能获得一个对typeglob的引用,它实际上是一个完整的符号表条目。但请参阅下面对*foo{THING}语法的解释。但是,您仍然可以像使用IO句柄一样使用类型globs和globrefs。
perldata也很有帮助。
总而言之,这就像构建一个对文件句柄的引用。您可以将其作为一个来使用。但是使用typeglob,您还可以做其他事情。符号表保存所有名为STDOUT的变量的值,即$STDOUT、@STDOUT、%STDOUT甚至&STDOUT,以及文件句柄。您只需使用一个typeglob即可访问所有这些应用程序。但是在使用STDOUT的情况下,您可能不必担心这一点,因为您的代码中可能没有%STDOUT。
这种类型的引用也是将文件句柄作为参数传递给函数的唯一方法。
sub myprint {
my $fh = shift;
print $fh "Hello World!\n";
}
&myprint(\*STDOUT);https://stackoverflow.com/questions/10477797
复制相似问题