首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BAREWORD文件句柄:不允许直接使用“数据”

BAREWORD文件句柄:不允许直接使用“数据”
EN

Stack Overflow用户
提问于 2017-07-21 17:36:53
回答 1查看 511关注 0票数 0

我试图从perl脚本的__END__部分读取一些tgz数据。我遇到了文件句柄的问题,有时使用它不会导致问题,有时脚本会抛出错误。

下面是一些示例代码,我知道数据不是tgz,但它确实显示了问题。)

代码语言:javascript
复制
#!/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.

如果我运行这个脚本

代码语言:javascript
复制
$ /tmp/data.pl 
<P>Script size is 0k at 1500655490

数据似乎可以使用。

但是,如果我取消注释print ref(DATA);,就会在该行中得到一个错误:

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

为什么早些时候使用数据也不是一个问题呢?

如果我将行改为

代码语言:javascript
复制
print "ref:". ref(\*DATA);

它不会抛出编译错误。到底怎么回事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-21 19:56:56

其他人已经解释了发生了什么。在perl需要文件句柄/文件use的上下文中,使用DATA是可以的。但是,在上下文(比如ref(DATA) )中,没有先验的理由假设参数是文件句柄/glob,这是不起作用的。

是否有用于DATA的词汇文件句柄解决方案?

我不太清楚你想要的是什么,但这可能会有帮助:

代码语言:javascript
复制
#!/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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45243616

复制
相关文章

相似问题

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