第49回 行入力演算子とコンテキスト

それでは、話をPerlに戻しまして、

ファイルを読み込む話をしたいと思います。「forとwhileの違い」の続きを書く為の伏線です。


ファイルを読み込む為には、以下のように書きます。

open my $file, '<', 'hoge.txt';



はじめてその変数を使うときは、 my を付けるのを忘れないようにしましょう。
'<'は、ファイルを「読み込む」ことを示しています。
'>'なら、ファイルに「書き込む」ことになります。他にもいろいろな指定が可能です。


行入力演算子

あとは、openに与えた変数(今回は、$file)を使って、ファイルの値を読み込むことができます。
ファイルを読み込む為には、行入力演算子と呼ばれる演算子を使います。行入力演算子は、

<>

という形をしており、

<$file>

というように、< と > の間に読み込みたいファイルを示している変数を置くことで読み込めます。

スカラーコンテキストで読み込む

それでは、次のようにスカラーコンテキストで読み込んでみましょう。
おっと、hoge.txtの中身は、

aaaaaaaa
bbbbbbbb
cccccccc
dddddddd
eeeeeeee

となっているとしましょう。

それでは、スカラーコンテキストで行入力演算子を使ってみます。

use strict;

open my $file, '<', 'hoge.txt';

my $c = <$file>;  # スカラーコンテキスト
my $d = <$file>;  # スカラーコンテキスト

close $file;

# $c と $d を表示
print $c;
print $d;

結果:

aaaaaaaa
bbbbbbbb

このように、$cには、hoge.txtの1行目が、
$dには、hoge.txtの2行目が読み込まれています。
このように、スカラーコンテキストで行入力演算子を評価すると、1行ずつ取り出してくれます。行入力演算子は、ファイルをどこまで読み込んだか覚えているので、つぎに読み込むときはつぎの行を返してくれます。ですから、$dには、hoge.txtの2行目が読み込まれているのです。
また、$c,$dを表示しているprint文に"\n"が書かれていないことに注意しましょう。
"\n"をprint文に与えていないのにもかかわらず、結果は、ちゃんと改行されています。
それもそのはずで、$cには、hoge.txtの

aaaaaaaa(改行)

と改行まで読み込まれているからです。


また、ファイルをもうこれ以上読み込まないというところで closeを使って、その旨をPerlにしめしています。


参考:ビンゴ中西のほげほげPerlのコンテキストを判断する基準



リストコンテキストで読み込む

それでは、リストコンテキストで読み込んでみる。

use strict;

open my $file, '<', 'hoge.txt';

my @c = <$file>;  # リストコンテキスト

close $file;

# @cを表示
print $_ for @c;

結果:

aaaaaaaa
bbbbbbbb
cccccccc
dddddddd
eeeeeeee

このように@cは、ファイルすべてを飲み込んでいます。
行入力演算子をリストコンテキストで評価すると、ファイルの中身すべてを返してきますので、@cには、ファイルの中身が全部はいってしまいました。

まとめ

このように行入力演算子は、コンテキストによって振る舞いを変えるのです。
この行入力演算子をうまく使ってファイルの中身を読み込んでいかなければなりません。



それでは、また〜