地球ウォーカー2

Scala, Python の勉強日記

初めての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 $_";
}
  • リストコンテキストでを使う
    • スカラーコンテキストの場合と動作は同じ。
    • ただし、この場合は「ループを実行する前に入力を全て読み込む」という点が異なる。
    • 一般論として、スカラーコンテキストで1行ずつ読み込むのが最良の方法。
foreach (<STDIN>) {
  print "line is $_";
}
ダイヤモンド演算子(diamond operator)
  • <>←これ。
  • 起動引数(コマンドライン引数)を読み込む。
  • すべての入力ファイルを連結したファイルを読み込むような扱いとなる。
    • ファイルが読み込めない場合、エラーメッセージを表示し次のファイルに移る。
while (defined($line = <>)) {
  chomp($line);
  print "line is $line\n";
}
  • ショートカットを使う:
while (<>) {
  chomp;                     # デフォルトは$_に対する処理
  print "line is $line\n";
}
起動引数
  • 起動引数のリストは@ARGVに格納される。
  • ダイヤモンド演算子は(内部的に)@ARGVの内容を見ている。
  • ダイヤモンド演算子を使う前なら@ARGVを編集することができる。
# こうすると、起動引数にかかわらず常に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 が出力される。
printf関数
  • C言語printf関数と同等の機能。
printf "$s of value is %g\n", $column, $val;
  • 数値には%gを使う。
    • 浮動小数点数、整数、指数形式のいずれかを必要に応じて表示する。
  • %dは10進整数(Decimal integer)。
    • 少数点以下は切り捨てられる。
  • 出力桁数のフォーマット:
 printf "%6d\n", 42;    #    42
 printf "%6.3f\n", 5/3  # 1.667
配列とprintf
my @items = qw( one two three );
printf "The items are:\n".("%10s\n" x @items)  # @itemの1度目はスカラーコンテキスト
       , @items;                               # 2度目はリストコンテキスト

初めてのPerl
初めてのPerl
posted with amazlet at 09.09.14
ランダル・L. シュワルツ トム フェニックス
オライリージャパン
売り上げランキング: 13789