読者です 読者をやめる 読者になる 読者になる

さわだのノート

書籍のお仕事に役立つかもしれない思いつきを記録しています。

RSS: 記事の更新情報 Rss Feed

[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