2017-02-10 57 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

相關問題