BAREWORD文件句柄:不允许使用“数据”字样

时间:2017-07-21 17:36:54

标签: perl

我正在尝试从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);

它不会抛出编译错误。发生了什么事?

1 个答案:

答案 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