首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl typeglobs和Real引用:如果我写到\*STDOUT而不是*STDOUT,我会得到什么?

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

Stack Overflow用户
提问于 2012-05-07 14:43:38
回答 4查看 1.1K关注 0票数 4

如果我写到像\*STDOUT这样的真实引用而不是像*STDOUT这样的typeglob,我会得到什么

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-05-07 15:10:39

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

据我所知,主要的实际区别是您不能将typeglob引用到对象中,但您可以使用typeglob引用(这就是IO::Handle所做的)

在"Perl Cookbook",配方7.16中详细讨论了这种区别。“将文件句柄存储在变量中”。

另一个不同之处在于,分配一个glob会为整个glob创建一个别名,而分配一个glob引用则会执行预期的操作(如perldoc perlmod, "Symbol Tables" section中所讨论的。举例说明:

代码语言:javascript
复制
@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";

产生:

代码语言:javascript
复制
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引用是将文件句柄传递到函数中的唯一方法,但事实并非如此:

代码语言:javascript
复制
sub pfh { my $fh = $_[0]; print $fh $_[1]; }

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

# Output:
# t1
# t2
票数 8
EN

Stack Overflow用户

发布于 2012-05-07 15:06:17

*表示一个typeglob,它是符号表中的一个条目。例如:

代码语言:javascript
复制
my $x;
print *x;

将产生*main::x

\表示引用。试试这个:

代码语言:javascript
复制
use YAML::XS;

print Dump *STDOUT;
print Dump \*STDOUT;

第一个是glob,第二个是引用。大概当你这样做的时候:

代码语言:javascript
复制
my $fh = *STDOUT;

您实际上是在将glob复制到一个新条目中,尽管我不认为这是非常有意义的--如果现在执行close STDOUT$fh也将关闭。这一点:

代码语言:javascript
复制
my $fh = \*STDOUT;

只是一个参考,这是首选的。另请参阅:

http://perldoc.perl.org/perldata.html#Typeglobs-and-Filehandles

票数 4
EN

Stack Overflow用户

发布于 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

这种类型的引用也是将文件句柄作为参数传递给函数的唯一方法。

代码语言:javascript
复制
sub myprint {
  my $fh = shift;
  print $fh "Hello World!\n";
}
&myprint(\*STDOUT);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10477797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档