2017-02-10 9 views
1

私は、ファイルの末尾にある__DATA__と__END__キーワードの間に格納されたテンプレート(テンプレートモジュールで処理するための)を持つPerlモジュールを持っています。テンプレートを使用してファイルを生成しようとすると、警告またはエラー出力なしで結果のファイルが空になります。デバッグ後、私は、DATAファイルハンドルが実際に空であり、それがテンプレートモジュールに渡されることを発見しました。読み込み時にPerlのDATAファイルハンドルが空です

このモジュールの以前のバージョンでは、DATAからテンプレートを正しく読み取ることができましたが、私が行った変更のどれもがこのコードの部分に影響するはずはありません。これらの変更は、完全に別個の機能内のロジックの変更で構成され、モジュールに次の使用ステートメントを追加:

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

Iは、Perlモジュールの書き込み権限を追加(それは本来読み取り専用であった)と__END__キーワードを除去しようとしていますそれが必要ではないことがわかったので。残念ながら、DATAファイルハンドルはまだ空に見えます。

DATAファイルハンドルを空にする原因になるのはどのような種類の問題で、これらの問題は私の状況に当てはまりますか?私はperl v5.12.5を使用しています。

+1

Debian stableの 'libswitch-perl'パッケージの説明では、「これはコアから削除されているため、互換性のために提供されている古いモジュールです」perl 5.10以降では' given'/'when 'builtinsがもっと好まれる。あなたはv5.12を使っているので、それらは利用可能です。 – david

答えて

8

この場合、DATAファイルハンドルが空である理由は、スイッチモジュールを使用することになります。このモジュールは、処理中にDATAファイルハンドルを壊しているsource filterを使用して動作します。

代わりにif-elsif-elseを使用するか、given-when構成を使用することができますが、これは実験的な機能なので、後のバージョンのPerlでは同じ動作をすることはできません。

編集:ここでは、上記の問題のためのシンプルな再生です:

# use Switch; 

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

__DATA__ 
One line of data 
Second line of data 

「使用・スイッチ」がなければ、あなたがプリントアウトラインが表示されますが、それには何も印刷されません。

+2

私は 'スイッチ'が不快だったと知っていましたが、私はあなたの ' – Borodin

+0

私は元の答えに再生器を追加しました。私はオンラインでこの問題の特定の参照を見つけることができませんでしたが、[ソースフィルタ](http://perldoc.perl.org/perlfilter.html)のドキュメント(「見ているもの」セクション)では、特にDATAセクションはソースフィルタによって狂ってしまうことがあります。 – robsws

+0

Hmm。データとコードを無差別に変更すると思います。どうもありがとう。 – Borodin

関連する問題