• ベストアンサー

__DATA__の意味

こんばんは、皆さん あるプログラムで__DATA__というものを見かけました。 while文で<DATA>となっているので、ファイルハンドルのようですが、 これの具体的な使用方法(__DATA__の有効範囲など)と、この名称を教えてください。 また、別の質問でも質問したように、こちらもリファレンスや2次元配列と一緒に解説されている書籍はありますでしょうか? 初心者向けの本に載っていないということは、中級者以上でないと使いこなせないものなのでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

__DATA__ トークンは、コレより以降にプログラムがない(データブロックの開始位置を示す)モノです。 既にでているようにこの部分のデータは、DATA ハンドルで普通のファイルのように(プログラム内にファイルが格納されているかのように)アクセスできます。 特殊な用法として、普通のファイルのようにstat(DATA)を使うことで、プログラムのサイズや最終更新日付を得ることができます。 同様のものに__END__がありますが、これは、メインパッケージの __DATA__ を表します。 また、自パッケージだけでなく、他パッケージの__DATA__ の部分は パッケージ名::DATA で読み込むことができます。 (通常はmain::DATA のmain が省略されている) __END__ を使用した場合には、他パッケージからは読込できません。 繰り返し読み込む場合には、 $pos=tell(DATA); しておいて seek(DATA,$pos,0); で読込位置をリセットします。 (seek を使うと、__END__ 以前の部分(プログラム)も読み込める) また、CPAN モジュールの Inline::Files を使うと、複数のファイルを埋め込むことができるようになります。

noname#17299
質問者

お礼

いつも詳しい回答ありがとうございます。 stat(DATA)はお礼を書き終えたら早速試してみます。 __END__と__DATA__の違いもわかりました。 パッケージはまだサンプル以外で使ったことがないので、 どういうときに使ったら便利なのかピンときませんが、 使うときまでそういうものがあったと覚えておきます。 seek関数を使って読み込み位置を制御できるのは便利ですね。 1行ずつ読み込みを制御するのでしょうか?これも試してみます。 Inline::Filesの使い方はいまいちよくわかりませんが、 現時点ではそういうものがあるとだけ覚えておきます。 どうもありがとうございました。

その他の回答 (2)

  • hara_peko
  • ベストアンサー率28% (11/38)
回答No.3

__DATA__の方はあまり使ったこと有りませんが、<DATA>の方であれば__END__と組み合わせてちょっとしたスクリプトの動作確認なんかによく使ったりします。いちいち読込用のファイルを作成してopenするのが面倒な時とかです。 参考URLはちょっとした調べ物などに便利な本です。

参考URL:
http://www.7andy.jp/books/detail?accd=30527064
noname#17299
質問者

お礼

売っているのはよくみかけますが、丸みを帯びた字がいい加減な印象だったので、 きちんと書かれていないのではないかという先入観を持っていました。 本屋さんに行ったら内容をよく読んでみます。 現在の自分のレベルと合っているか確認して、使えそうだったら買ってみます。 ありがとうございました。

  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.1

__DATA__は特殊リテラルでファイルハンドルDATAで読み出す事ができます。具体例は参考URLの「プログラム内データの読み込み」を読んでみてください。 こちらについては、難易度というよりあまり使用されていないからというのが、解説が省略されている理由のような気がします。

参考URL:
http://www.rfs.jp/sb/perl/02/02.html#8%EF%BC%8E%E7%89%B9%E6%AE%8A%E3%83%AA%E3%83%86%E3%83%A9%E3%83%AB
noname#17299
質問者

お礼

せっかく回答いただいて申し訳有りません。 URLの説明を読みましたが、残念ながらわかったようでよくわかりませんでした。 __DATA__がなく一覧と言えるか微妙でした。 また、教えていただいたURLの内容だと__END__と__DATA__の違いが明確になりませんでした。 __DATA__は特殊リテラルと言うんですね。 この名称がわかったので知識の土台が増えました。 今後は特殊リテラルで検索することができるようになりました。 ありがとうございました。

関連するQ&A