2017-02-10 54 views
1

我有一个模块(用于模板模块处理)的Perl模块存储在文件末尾的__DATA__和__END__关键字之间。当试图使用该模板生成文件时,生成的文件变空并且没有警告或错误输出。调试完成后,我发现DATA文件句柄在传递给模板模块之前实际上是空的。Perl数据文件句柄在读取时为空

该模块的以前版本能够正确地从DATA中读取模板,但是我所做的任何更改都不应该影响这部分代码。这些变化包括逻辑变化完全独立的功能和添加以下使用语句到模块内:我试图perl的模块上加上写入权限

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

(它最初只读)并除去__END__关键字因为我发现这不是必要的。不幸的是,DATA文件句柄仍然显示为空。

什么样的问题可能导致DATA文件句柄为空,并且这些问题是否适用于我的情况?我正在使用Perl V5.12.5。

+1

请注意,Debian stable中libswitch-perl软件包的描述是这样的:“这是一个为了兼容性而提供的废弃模块,因为它是从核心中移除的。对于perl 5.10及以上的'given' /'when '建筑物更受青睐。“由于您使用的是v5.12,因此可用。 – david

回答

8

在这种情况下,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 

没有“使用开关”,你会看到打印出来的线条,但它没有打印。

+2

我知道'Switch'很不愉快,但我不知道它与你的'DATA'部分混淆。你有没有参考 – Borodin

+0

我添加了一个复制原来的答案。我无法在线找到关于此问题的具体参考,但[源过滤器](http://perldoc.perl.org/perlfilter.html)文档(“要注意的东西”部分)特别提到了数据部分可能会被源代码过滤器破坏。 – robsws

+0

嗯。我猜想它不分青红皂白地修改数据和代码。非常感谢。 – Borodin

相关问题