初めてのPerl その5(6章)
前回の続き。
6章 入出力の基本
演算子
- スカラーコンテキストの場合、入力から次の1行を読み込んで返す。
chomp($line = <STDIN>); # 次の行を読み込んで行末の改行文字を取り除く
- 行入力演算子は、ファイルの終わりに
undef
を返す。 - 1行ずつ読み込んで処理をする:
while (defined($line = <STDIN>)) { print "line is $line"; }
- より良い書き方:ショートカットを使う
# whileループの条件部に行入力演算子を単独で使った場合のみ、 # $_に入力行が格納される。 while (<STDIN>) { print "line is $_"; }
- 等価の式:
while (defined($_ = <STDIN>)) { print "line is $_"; }
- リストコンテキストで
を使う
foreach (<STDIN>) { print "line is $_"; }
ダイヤモンド演算子(diamond operator)
<>
←これ。- 起動引数(コマンドライン引数)を読み込む。
- すべての入力ファイルを連結したファイルを読み込むような扱いとなる。
- ファイルが読み込めない場合、エラーメッセージを表示し次のファイルに移る。
while (defined($line = <>)) { chomp($line); print "line is $line\n"; }
- ショートカットを使う:
while (<>) { chomp; # デフォルトは$_に対する処理 print "line is $line\n"; }
起動引数
# こうすると、起動引数にかかわらず常にone two threeを読み込む。 @ARGV = qw# one two three #; while (<>) { chomp; print "$_\n"; }
print
演算子
- 値のリストを受け取ってそのリストの要素を標準出力に送る。
- 配列を表示した時と変数展開した配列を表示した時で結果が異なる。
my @array = qw/ one two three /; print @array; # onetwothree print "@array"; # one two three
- 変数展開した配列の場合、各要素の間にスペースを追加して表示する。
- 要素の末尾に改行文字が入っている場合は注意が必要
print "@array"; #改行文字が入っている場合、 #改行+スペースで2行目以降がインデントがずれてしまう。 #one # two # three
- 一般論として、改行文字が含まれる場合にはそのまま表示する。
print @array;
- 含まれない場合は末尾に改行文字を付け加える。
print "@array\n";
バッファリングについて
- デフォルトでバッファリングされる。
- バッファリングの制御をすることも可能(Perlのマニュアルページを参照)。
printとダイヤモンド演算子
print
の引数はリストコンテキストで評価される。- リストコンテキストでは、
<>
は行のリストを返す。
print <>; # catコマンド print sort <>; # sortコマンド
printと括弧
- Perlでは、文の意味が変わってしまう場合以外は括弧を省略可能。
- printの括弧はつけてもつけなくても良い。
- 括弧をつけると関数呼び出しになる。
- I/Oエラーが発生しない限り、1を返す。
- 括弧をつける場合は注意が必要:
print (2+3) * 4; # 5 が出力される。