2019年5月14日火曜日

[Perl] 06. 文字列出力

今回は文字列出力に関するメモ。
print 関数、printf 関数を使って文字列を出力する。ついでに sprintf 関数についてもメモしておく。
ファイルへの出力 (ファイルハンドル) については、前前前回(?)の記事を参照。



print / printf / sprintf の使い分け
文字列の出力方法によって print, printf 関数を使い分ける。sprintf 関数はコンソールやファイルへの出力ではなく、書式の変換に用いる。

単純に出力したい → print
書式を指定して出力したい → printf
書式を指定して変換したい → sprintf


print
print 関数は指定された文字列をそのまま出力する。変数を出力したい場合は "" で括る必要があるので注意。

print [FILEHANDLE] LIST

 FILEHANDLE : ファイルハンドル
 LIST : 出力する文字列のリスト

$moji = 'aaa';
@array = ('aaa', 'bbb', 'ccc');

print "$moji"."\n";
print '$moji'."\n";  # '' は $moji を変数と認識しない
print "@array"."\n";
実行結果
aaa
$moji
aaa bbb ccc

printf
printf 関数は書式を指定して文字列を出力する。

printf [FILEHANDLE] FORMAT, LIST

 FILEHANDLE : ファイルハンドル
 FORMAT : 書式
 LIST : 出力する文字列のリスト

書式についてまとめる。(他にもあるかも...)

%% パーセントマーク
%d 10進数 (符号付き)
%u 10進数 (符号なし)
%b 2進数
%o 8進数
%x 16進数 (符号なし) ※小文字
%X 16進数 (符号なし) ※大文字
%f 浮動小数
%e 浮動小数 (指数表記)
%g 浮動小数 (%f %e 自動判定, 末尾の0は非表示)
%c 文字 (LISTでASCIIコード番号を指定)
%s 文字列
%p ポインタアドレス(16進数)

$num = 60;

printf("%%d = %d\n", $num);
printf("%%u = %u\n", $num);
printf("%%b = %b\n", $num);
printf("%%o = %o\n", $num);
printf("%%x = %x\n", $num);
printf("%%X = %X\n", $num);
printf("%%f = %f\n", $num);
printf("%%e = %e\n", $num);
printf("%%g = %g\n", $num);
printf("%%c = %c\n", $num);
printf("%%s = %s\n", $num);
printf("%%p = %p\n", $num);
実行結果
%d = 60
%u = 60
%b = 111100
%o = 74
%x = 3c
%X = 3C
%f = 60.000000
%e = 6.000000e+01
%g = 60
%c = <
%s = 60
%p = 176f2a8

複数の文字列を指定することもできる。
$num1 = 10;
$num2 = 20;
$num3 = 30;

printf("%d %d %d\n", $num1, $num2, $num3);
実行結果
10 20 30

次は修飾子について。書式指定時に % の直後に修飾子を付加することで、書式をフォーマットすることができる。
%n nは文字列の長さを示す整数。右詰めとなる。
%0n nは文字列の長さを示す整数。右詰め & 0埋めとなる。
%-n nは文字列の長さを示す整数。左詰めとなる。
%+ 符号(+ -)を付加。
%# 識別子(16進: 0x, 8進: 0, 2進: 0b)を付加
%.m mは少数点以下の桁数。浮動小数(%f %e)で使用。

$num = 60;

printf("%%8d   = %8d"  ."\n", $num);
printf("%%-8d  = %-8d" ."\n", $num);
printf("%%08d  = %08d" ."\n", $num);
printf("%%+d   = %+d"  ."\n", $num);
printf("%%#x   = %#x"  ."\n", $num);
printf("%%.2f  = %.2f" ."\n", $num);
printf("%%8.2f = %8.2f"."\n", $num);  # %n.m の組み合わせも可能
実行結果
%8d   =       60
%-8d  = 60
%08d  = 00000060
%+d   = +60
%#x   = 0x3c
%.2f  = 60.00
%8.2f =    60.00

sprintf
sprintf 関数を使用して、書式の変換を行うことができる。

sprintf FORMAT, LIST

 FORMAT : 書式
 LIST : 出力する文字列のリスト

$num = 60;

$sig_num = sprintf("%+d", $num);  # 符号付加
$hex_num = sprintf("%#x", $num);  # DEC->HEX 変換

print "$sig_num"."\n";
print "$hex_num"."\n";
実行結果
+60
0x3c

上記の例では 10進数 → 16進数 の変換を行っているが、16進数 → 10進数 の変換を行う場合は、数値と文字列ではやり方が異なるので注意。文字列の場合は hex 関数を使用する。
$hex1 = 0x3C;    # 数値
$hex2 = '0x3C';  # 文字列
$hex3 = '3C';    # 文字列 (0x 省略)

# HEX->DEC 変換
$dec1 = sprintf("%d", $hex1);
$dec2 = hex $hex2;
$dec3 = hex $hex3;

print "$dec1 $dec2 $dec3\n";
実行結果
60 60 60


0 件のコメント:

コメントを投稿