2016-12-09 1 views
0

Perlのデータセクション__DATA__から読みやすいです。Perlのデータセクションへの書き込み

foreach (<DATA>) { 
    print("- $_"); 
} 

__END__ 
1 
2 
The End of The End 

を生成します:

- 1 
- 2 
- The End of The End 

私はセクションにデータを書き込むのいずれかのきちんとした方法を発見していないが 次のコードは、既存のDATAハンドルを使用しています。 たとえば、私は次のことを試してみた:expectetとしてSTDOUTSTDERR作品に

use feature say; 

say STDERR 'Some Error'; 
say STDOUT 'Some Message'; 
say DATA 'Some Data'; 

__DATA__ 
foo bar 

印刷:

perl write.pl 2> /dev/null 
Some Message 

しかしDATAへの印刷は全く何もしない:

tail -2 write.pl 
__DATA__ 
foo bar 

私はCPANからいくつかのモジュールも見てきましたが、私はいつものサポートを見つけました。ではなく、と書いてください。です。 ヒントや助けてくれてありがとう!

+7

。代わりに別のデータファイルを使用してください。 – shawnhcorey

+0

これは悪い考えかもしれませんが、これまで(それまではテストできなかったかもしれません)いくつかのファンキーなギミックツールには便利です。私はそれを行うための純粋な方法を探しています(何らかの純粋な方法が存在する場合)。狂った方法はおそらく自分のスクリプトでファイルハンドルを開くことです...もしこれが可能であれば? –

+4

DATAファイルハンドルに「書き込み」できません。 '$ 0'を"開く "ことができ、それを探したり書き込んだりできます。しかし、これは良い考えではありません。 – Sobrique

答えて

8

テキストエディタでDATAセクションに書き込むことができます。

他のすべてはdark magicです。入力とプログラム状態を別々のファイル(またはデータベース)に格納する。

+0

この場合、ダークマジックは気にしません!私はできるだけ早くこれをチェックします。ヒントのためのThx。それが意図したとおりに機能するならば、実際の答えはうまくいくでしょう。 –

+2

@BorisDäppen*あなたは暗い魔法を気にしないかもしれませんが、あなたがそれを大いに気にしてからあなたのソフトウェアを維持しなければならない人は誰でも。 – ThisSuitIsBlackNot

+2

@BorisDäppenいつか誰かがこのような解決策をとってあなたを怒らせたいと思うでしょう。一方、...それは本当にクールな解決策です(https://www.youtube.com/watch?v=MQm5BnhTBEQ)。 –

0

アイデアは、データが出力、あなたはこのように、追加のテキストを含む変数を参照するには、その後、それを閉じて再度開くことができ何に物事を追加する場合:

#!/usr/bin/perl 

use strict;use warnings; 

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

close DATA; 

my $additional_text = 'test2'; 
open DATA, '<', \$additional_text; 
$additional_text .= "\ntest3"; 
while(<DATA>) { 
    print("- $_"); 
} 

__DATA__ 
test 

しかし、あなたが使用する必要があります前のデータはDATAセクションに含まれていたと思います。

+0

私が理解する限り、これはファイルに永続的ではありません。多分、私はこれについての質問で十分ではない。しかし、私は永続的なものを探しています。 –

0

DATAに書き込むと、スクリプトが変更されます。これは、データ自体がスクリプト自体の読み取り用に開かれているため、悪い考えです。このプログラムは、なぜこれが悪い考えであるかを示しています。

#!/usr/bin/perl 

use strict; 
use warnings; 

seek DATA, 0, 0; 
while(<DATA>){ 
    print; 
} 

__DATA__ 
1 
2 
3 
+0

あなたのスクリプトを実行することによって、あなたがあなたに言及していること、そしてそのスクリプトで見せようとしていること、なぜ「なぜ」が正確に何であるかはわかりません。もっと詳しく説明できますか? –

+0

DATAファイルハンドルは、スクリプト全体の読み取り用にオープンされています。書き込み用に再度開いて、スクリプト全体を変更することができます。これによりコードインジェクションに脆弱になります。 – shawnhcorey

2

あり、これには良い理由はおそらくありませんが、ここではどのようである:スクリプト内からPerlスクリプトを修正するために、本当に、本当に悪い考えです

#!/usr/bin/env perl 

use strict; 
use warnings; 

seek DATA, 0, 2; # go to the end of the source file 
my $offset = tell(DATA); # remember where that is 

open my $f, '>>', $0 # open source file for appending 
    or die $!;  # of course, you could use DATA instead of $f here 

seek $f, $offset, 0; # go to the previously recorded position 

print $f "This is a test\n"; # put something there 

__DATA__ 
+0

この解決策は常にファイルの最後に追加されます。私はまた、データを置き換える方法を探しています。私はあなたの解決策と暴力団からの "暗い魔法"で私が望むことをすることができると思います。この有益な答えをありがとう! –

関連する問題