Perl DATA 文件句柄在读取时为空

Posted

技术标签:

【中文标题】Perl DATA 文件句柄在读取时为空【英文标题】:Perl DATA filehandle is empty when read 【发布时间】:2017-02-10 13:48:43 【问题描述】:

我有一个 Perl 模块,在文件末尾的 __DATA__ 和 __END__ 关键字之间存储了一个模板(供 Template 模块处理)。尝试使用模板生成文件时,生成的文件为空,没有警告或错误输出。经过调试,发现DATA文件句柄在传递给Template模块之前其实是空的。

此模块的先前版本能够正确地从 DATA 读取模板,但我所做的任何更改都不应该影响这部分代码。这些更改包括完全独立的函数中的逻辑更改以及向模块添加以下使用语句:

use DBI;
use DBI::Const::GetInfoType;
use Switch;

我尝试在 perl 模块上添加写权限(它最初是只读的)并删除 __END__ 关键字,因为我发现这不是必需的。不幸的是,DATA 文件句柄仍然显示为空。

什么样的问题会导致 DATA 文件句柄为空,这些问题是否适用于我的情况?我正在使用 perl v5.12.5。

【问题讨论】:

请注意,Debian stable 中libswitch-perl 软件包的描述说:“这是一个为兼容性而提供的过时模块,因为它已从核心中删除。对于 perl 5.10 及更高版本,given /when 内置函数更受欢迎。”由于您使用的是 v5.12,因此这些都是可用的。 【参考方案1】:

在这种情况下 DATA 文件句柄为空的原因归结为 Switch 模块的使用。该模块通过使用source filter 工作,它在处理过程中破坏了 DATA 文件句柄。

替代方法包括使用 if-elsif-else 或使用 given-when 构造,尽管这是一个实验性功能,因此在 Perl 的更高版本中它的行为可能不同。

编辑:这是上述问题的简单复制器:

# use Switch;

while(<DATA>) 
  print($_);


__DATA__
One line of data
Second line of data

如果没有“使用开关”,您会看到打印出的行,但没有打印任何内容。

【讨论】:

我知道Switch 令人不快,但我不知道它与您的DATA 部分混淆了。你有那个参考吗 我在原始答案中添加了一个复制器。我无法在网上找到对此问题的具体参考,但 source filter 文档(“注意事项”部分)特别提到 DATA 部分可能会被源过滤器破坏。 嗯。我猜它会不加选择地修改数据和代码。非常感谢。

以上是关于Perl DATA 文件句柄在读取时为空的主要内容,如果未能解决你的问题,请参考以下文章

perl打开读取文件(open)

Perl - Win32 - 如何从另一个进程非阻塞读取文件句柄?

读取 csv 文件时雪花句柄为空

Perl open3读取gnuplot块的管道句柄

Perl 使用自定义文件句柄打开外部命令

Perl 文件操作