真里:加藤真里 シレ:シレスト=ノイデルファーム
シレ:さて、前回までで「データの入れ物」については説明しました。
真里:……なんかテキトーな説明だったんだけど……
シレ:いいんです、「こんなものがあるんだなー」程度に理解していれば。いろいろ理屈を言うより実際にスクリプトを見て説明したほうが早いですしね。
真里:……あの、それって「よーわからんシロモノは無視してとりあえず読めて書ければいいや」ってこと???
シレ:み、ミもフタもなくいうとそういうことですが(汗)Perlはテキトーに書いてテキトーに動かせばテキトーに動いてくれる言語ですから。Cとかを解説するのなら別ですけど……
真里:あたい向きってことね、それ。
シレ:だから真里さんを生徒にしたらしいですよ、編集長(=ポナ)が言ってましたけど……。さて、今回はですね、ファイルの入出力についてです。せっかく得たデータもちゃんと保存しておかなければいけませんよね。突然ソフトが止まって何時間もかけた仕事がパーになったことあるでしょう(苦笑)
真里:……そ、それだけは思い出させないでっ。
シレ:で。前置きはさておき、まずはファイルの保存です。
open(HANDLE,">ファイル名");
print HANDLE "データ";
close(HANDLE);
……これだけです。
真里:……って、これだけ?
シレ:そうです。HANDLEはファイルハンドルといって、「どのファイルかを示すもの」です。ちゃんとどのファイルか区別しておかないとゴチャゴチャになりますよね。アルファベット(数字も可ですが)の大文字で1単語で書いてください、例えばSHILLESTとかMARIというふうにですね。
open、closeはそれぞれ「このファイルを今から使うよ」「使い終わったよ」と教えているというふうに理解して下さい。で、print命令で書き込みます(印刷するわけではありませんよ…笑)。
あ、それから、>マークにも注意してくださいね。これは「書き込みモード」を意味しますから。
真里:じゃ、いちいち「ファイルハンドル」とかいうモノは何の役に立ってるの?
シレ:……そうですね、2つのファイルをopenで開いておいて何かをする場合、
open(HANDLE1,">ファイル名1");
open(HANDLE2,">ファイル名2");
print HANDLE1 "データ";
print HANDLE2 "データ";
close(HANDLE1);
close(HANDLE2);
……というふうに区別するわけです。
真里:……じゃぁさ、そうやってせっかく保存したものを読み出す時は?
シレ:とりあえず、下のようにする、ということを覚えておいて下さい。
open(HANDLE,"ファイル名");
@data = <HANDLE>;
close(HANDLE);
@dataは前回の「配列」ですね。<HANDLE>はopenで指定したファイルから1行ずつ読み出してくるという意味です。つまり、@dataの中に1行分ずつファイルの中身がおさまってくれます。
先ほどと違って>マークはありません。読み込みモードで開かないといけませんからね。
真里:そうすると、さっきのモノを動かしたあとで$data[1]ってすれば1行めが出てくるの?
シレ:惜しいですが……違います。前回配列は0から始まると説明しましたね?
真里:わかった、$data[0]で1行め、$data[9]で10行め……なんだ。
シレ:そういうことです。……さて、ホントはファイル書き込み/読み出しには他の方法もありますし、まだまだいろいろと説明することはあるんですが、とりあえずここで一区切りです。
真里:……ううう、なんだかわからなくなってきたよぉ(涙)
シレ:こんな短期間で理解するほうがおかしいですから、気をおとさないでくださいよ(汗)
真里:こんなあたいでもできるの??なんかよーわからんモノを……ハッシュとか配列とかファイルハンドルとか……言われてもさ、全然……
シレ:確かに、突然ああだこうだと説明並べても騙されているような気分になるだけですよね、私もそう思います(ヲイ)。……というわけで次回からはもう実際に書いてみましょう。ただし基本的に1行ごとに「翻訳」を入れるというパターンでいきますのでご安心を。
[次回に続く……]