[Perl]マルチバイト文字を含む文字列でprintfの桁合わせ
printfとかsprintfを使うときに困るのが、マルチバイト文字の扱い。桁数を指定してもがたがたに崩れてしまう。その対策を考えてみたのでメモしておく。
桁数からマルチバイト文字の文字数分を引けばいいだけだった。printf(もしくはsprintf)の第一引数の文字列に「%*s」を指定し、第二引数に数値を渡すことで、可変長の桁数を指定できるようだ。
#!/usr/bin/env perl use v5.18; use warnings; use utf8; use Encode qw/encode_utf8/; while (<DATA>) { chomp; my ($ko, $page) = split /\t/ => $_; # 英数字以外の文字を取得 => scalar @nihongoで文字数をカウント my @nihongo = $ko =~ m/\P{InBasicLatin}/g; # 「%*s」で引数を渡すことで、可変長の桁数を指定できる my $output = sprintf "%-*s%s", 24 - scalar @nihongo, $ko, $page; say encode_utf8 $output; } __DATA__ Googleミュージック 119 Microsoftアカウント 334 アップルストア 224
出力結果はこんな感じ。
Googleミュージック 119 Microsoftアカウント 334 アップルストア 224