書式をどの値に設定するのかをインデックスで指定する

複数の値に対して一度に書式を設定する場合、通常は値が記述されている順番に設定されますが、どの位置に記述された値に対してどの書式を設定するのかをインデックスを使って指定することができます。ここでは Perl でフォーマット指定子を記述するときに書式をどの値に設定するのかをインデックスで指定する方法について解説します。

(Last modified: )

書式を設定する値をインデックスで指定する

通常値は記述された順番に書式が設定されていきます。書式指定文字列で対象の値のインデックスを指定することで、任意の位置にある書式を設定することができます。

次の例を見て下さい。

printf("A=%d, B=%d\n", 123, 456);

上記の場合は "A=123, B=456" と表示されます。値が 2 つ指定されていますが、並べられた順に書式が設定されます。

では次のように変更してみます。

printf("A=%2\$d, B=%1\$d\n", 123, 456);

今度の場合は "A=456, B=123" と表示されます。これは値を指定した順ではなくどの値を使用するかをインデックスを使って指定しています。

インデックスは値が並べられた順に 1,2,3,... となっています。 0 からではないので注意して下さい。そしてフォーマット指定子の中で次のようにインデックスを指定します。

インデックス$

記述する位置はフォーマット指定子の中の % の直後です。例えば 2 番目の値を使用する場合は 2$ と記述します。

注意する点として、書式指定文字列を指定する時にシングルクオーテーションを使用している場合はこのまま記述できますが、ダブルクオーテーションを使用している場合は $ に対してエスケープシーケンスする必要があります。よってこの場合は 2\$ のように記述します。

printf("A=%2\$d, B=%1\$d\n", 123, 456);
printf('A=%2$d, B=%1$d', 123, 456);

同じ書式指定文字列の中で同じ値を繰り返し指定しても構いませんし、インデックスを指定せずにフォーマット指定子を記述する方法と併用しても構いません。

printf("A=%2\$d, B=%2\$d\n", 123, 456);
printf("%2\$d, %d, %1\$d, %d\n", 123, 456);

上記を実行すると次のように表示されます。

A=456, B=456
456, 123, 123, 456

インデックスを指定しないフォーマット指定子については、通常通り値が先頭から順に使用されます。

サンプルコード

それでは簡単なサンプルを作成します。

use strict;
use warnings;
use utf8;
binmode STDIN, ':encoding(cp932)';
binmode STDOUT, ':encoding(cp932)';
binmode STDERR, ':encoding(cp932)';

printf("A=%d, B=%d\n", 123, 456);
printf("A=%2\$d, B=%1\$d\n", 123, 456);
printf("A=%2\$d, B=%2\$d\n", 123, 456);
printf("%2\$d, %d, %1\$d, %d\n", 123, 456);

テキストエディタでプログラムを記述したあと sample.pl という名前で保存します。(文字コードは UTF-8 です)。コマンドプロンプトを起動し、プログラムを保存したディレクトリへ移動したあとで次のように実行します。

perl sample.pl

次のように実行結果が表示されます。

書式をどの値に設定するのかをインデックスで指定する(1)

どの値に対してどの書式を設定するのかをインデックスを使って指定しました。

-- --

Perl でフォーマット指定子を記述するときに書式をどの値に設定するのかをインデックスで指定する方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。