我正在尝试从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
DATA似乎可以使用。
但是,如果我取消注释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.
为什么之前使用DATA也不是问题?
[post-post update]如果我将行更改为
print "ref:". ref(\*DATA);
它不会抛出编译错误。发生了什么事?
答案 0 :(得分:4)
其他人已经解释了发生了什么。在perl
期望文件句柄/ fileglob的上下文中,可以使用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__
One