我试图从perl脚本的__END__部分读取一些tgz数据。我遇到了文件句柄的问题,有时使用它不会导致问题,有时脚本会抛出错误。
下面是一些示例代码,我知道数据不是tgz,但它确实显示了问题。)
#!/usr/bin/env perl
use strict;
use warnings;
my $raw_time = (stat(DATA))[9];
my $size = -s DATA;
my $kilosize = int($size / 1024) . 'k';
print "<P>Script size is $kilosize at $raw_time\n";
#print ref(DATA); #UNCOMMENT TO SEE THE PROBLEM?
__DATA__
DO NOT REMOVE THE PRECEDING LINE.
Everything else in this file will be ignored.如果我运行这个脚本
$ /tmp/data.pl
<P>Script size is 0k at 1500655490数据似乎可以使用。
但是,如果我取消注释print ref(DATA);,就会在该行中得到一个错误:
Bareword "DATA" not allowed while "strict subs" in use at /tmp/data.pl line 12.
Execution of /tmp/data.pl aborted due to compilation errors.为什么早些时候使用数据也不是一个问题呢?
如果我将行改为
print "ref:". ref(\*DATA);它不会抛出编译错误。到底怎么回事?
发布于 2017-07-21 19:56:56
其他人已经解释了发生了什么。在perl需要文件句柄/文件use的上下文中,使用DATA是可以的。但是,在上下文(比如ref(DATA) )中,没有先验的理由假设参数是文件句柄/glob,这是不起作用的。
是否有用于
DATA的词汇文件句柄解决方案?
我不太清楚你想要的是什么,但这可能会有帮助:
#!/usr/bin/env perl
use strict;
use warnings;
# You could use any variable name you like
my $DATA_FH;
CHECK { $DATA_FH = \*DATA }
print <$DATA_FH>
__DATA__
Onehttps://stackoverflow.com/questions/45243616
复制相似问题