§6.2 標準出力への出力


作成日:2001/08/01(水)

前節では標準入力からのデータ入力について見てきました。 ここでは、標準出力からの出力について紹介します。 と言ってもこれは今までにもう何度も何度もやってきたことです。

print関数による出力

print関数はもう何度も使ってきたおなじみの関数だと思います。 今までは、

 print "hogehoge";

という使い方をしてきましたが、実はこれは簡略化した使い方です。 print関数は、表示する文字列(またはカンマで区切った文字列リスト)のほかに出力先のファイルハンドルを受け取ります。 ですからホントは、

 print STDOUT "hogehoge";
 #標準出力のファイルハンドルはSTDOUTでしたね。

のように書きます。 ですが、最初のようにファイルハンドルを省略するとprint関数は標準出力へ文字列を出力します。

また複数の文字列を表示するには、それらをカンマで区切ってリストにします。

 print "hogehoge", "harahoro", "gachoon";

さて、次のコードを見てください。

 print (3 + 2) * 3;

上のコードの出力は15ではなく5です。 これはprint関数が、引数のリストを示すものとしてカッコを探し、閉じカッコの後のものは全て無視してしまうからです。 きちんと15を出力させるには、

 print ((3 + 2) * 3); #15を出力

とします。

前節でも説明しましたが、出力する文字列リストを省略すると、print関数は特殊変数$_の中身を表示します。

 while(<STDIN>){
   print;
 }

printf関数初登場

printf関数は、C言語をご存知の方にはなじみがあると思います。 Perlのprintf関数も、C言語の物と同じような働きをします。

 printf "%10s", "hoge";

printf関数は出力する文字列(あるいは文字列のリスト)のほかに、その文字列をどんなフォーマットで出力するかを指定するフォーマット制御文字列を引数として受け取ります。 ここで「フォーマット」とは、「10進数として」出力するのか、「文字列として」出力するのかといったデータ型や、出力する位置などの情報のことです。 フォーマット制御文字列は次のような形をしています。

 %m.nx

mとnは出力する場所(フィールド)のサイズです。 引数をどのような形で(10進数としてなのか、文字列としてなのか)出力するかによって解釈されます。 またこの部分は省略することもできます。 xはフィールドのデータ型です。 上の例では%10sというのがフォーマット制御文字列になります。 このうち10がフィールドのサイズを表していて、そのあとのsが、引数を「文字列として」表示しなさいというデータ型です。 ですから上のコードは、「hoge」という文字列を、サイズ10のフィールド内に右揃えで出力します。

      hoge

次の表は、フォーマット制御文字列に指定できるデータ型の一覧です。



データ型 説明
c 文字
d 10進数
e 指数浮動小数点数
f 固定小数点浮動小数点数
g コンパクト浮動小数点数
ld 10進長整数
lo 8進長整数
lu 符号なし10進長整数
lx 16進長整数
o 8進数
s 文字列
u 符号なし10進数
x 16進数
X 16進数(大文字)


次にいくつか例を挙げましょう。まずは10進数から。

 printf "%10d", 12345;

また次の例はスカラー変数の値を出力しています。

 $pi = 3.14159;
 printf "%5.2f", "$pi";

上の例では「3.14」と出力されます。 「%5.2f」の「5」はフィールドのサイズで、「2」は小数点以下の出力桁数です。 出力するフィールドのサイズが小さく、数値が入らない場合は、Perlが自動的に調整してくれます。

 $pi = 3.14159;
 printf "%10s %10d %5.2f", "hoge", 12345, "$pi";
 printf "%-10s %-10d %-5.2f", "hoge", 12345, "$pi";

上のようにすることで、複数の文字列を出力することも出来ます。 また2行目のように、フィールドサイズに負の値を指定すると文字列を左寄せして出力します。

ここでは標準出力への出力についてお話しました。 この章の内容はすでにご存知の方も多いと思います。 次の章では、Perlの強力な武器の1つ、正規表現についてお話します。


「§6.1 標準入力からの入力」へ 「§7.1 正規表現」へ
ソフトバンク パブリッシング株式会社

Copyright (C) can All Rights Reserved
e-mail:ishiki@mrj.biglobe.ne.jp