Perl楽しいから好き

Perlをはじめとしたプログラミング周りのあれこれについて。モダーンなPerlを楽しんでいます。

Perlでuse utf8したまま明示的に半角スペースを全角スペースに置き換える

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use 5.010;
use Encode qw(encode);

# 半角スペースを明示的に全角スペースにする
my $str = "ニューヨーク シティボーイ";
say encode('utf8', $str); # ニューヨーク シティボーイ
$str =~ s/\s/\x{3000}/g;
say encode('utf8', $str); # ニューヨーク シティボーイ

データベースに登録された氏名の苗字と名前の間が全角スペースのものがある。で、検索フォームから苗字と名前の間を半角スペースで入力した時にマッチさせたい、という要望に応えるために書きました。

use utf8プラグマを書くと \s が半角スペースにも全角スペースにもマッチする、というのは単純にスペース除去するときは便利。なんだけど、半角スペース←→全角スペースを置き換えたいとき、ちょっとつまづいちゃいました。

my $full_space = "\x{3000}";

↑このコードポイント表現で全角スペースを示せるので、それを使いました。

2018/7/21 追記

jitojitoさん、コメントありがとうございます。確かに半角スペースのみを厳密に指定するなら、そっちもコードポイントで記述するのがいいですね。

Perlでuse utf8したまま明示的に半角スペースを全角スペースに置き換える - Perl楽しいから好き

\s はタブ文字なども含まれますので、半角空白のみなら /\x{0020}/\x{3000}/ とするほうが良いかもしれません。

2018/07/21 10:07

ということで書き直してみました。
 ↓

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use 5.010;
use Encode qw(encode);

# 半角スペースを明示的に全角スペースにする
my $str = "ニューヨーク シティボーイ";
say encode('utf8', $str); # ニューヨーク シティボーイ
$str =~ s/\x{0020}/\x{3000}/g;
say encode('utf8', $str); # ニューヨーク シティボーイ


イイ感じになりました。ありがとうございます!