Perl で全角空白(スペース)にマッチ

use utf8; をすると \s で全角空白(スペース)にもマッチするということでスクリプトを作っていたら、どうも上手く動作しないので調べてみると。\s で全角空白にマッチするのは UTF8 フラグが付いている文字列に対してらしい。
外部から読み込んだファイルの文字列には use utf8; しても UTF8 フラグが付かないので上手く動かなかったらしい。
そこで、外部から読み込んだ文字列は Encode::decode_utf8 で UTF8 フラグを付ける。

#!/usr/bin/env perl -wnl
use strict;
use warnings;
use Encode;
use utf8;

my $line = $_; # UTF8 フラグ無し
my $str = "内部:hello world.ハロー ワールド。"; # UTF8 フラグ有り
my $line2 = Encode::decode_utf8($line); # UTF8 フラグを付ける

$line =~ s/\s//g;
$line2 =~ s/\s//g;
$str =~ s/\s//g;

print $line;
binmode STDOUT, ":utf8";
print $line2;
print $str;

実行結果

$ ./u8.pl hoge.txt
外部:helloworld.ハロー ワールド。
外部:helloworld.ハローワールド。
内部:helloworld.ハローワールド。

hoge.txt の中身

外部:hello world.ハロー ワールド。

内部文字列では UTF8 フラグが付いているために全角空白も \s でマッチしている。

参考:Perl 5.8.x Unicode関連

ミニマルPerl Unix/LinuxユーザのためのPerl習得法
Tim Maher
オライリージャパン
売り上げランキング: 279701
«
»