正規表現で全角文字(ひらがな・かたかな・漢字、記号など)、半角カタカナをマッチさせる

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

# 全角文字、全角記号、全角英数字、半角カナを含めている
my $strings = "Aあb漢Cイd字0ギ-ャ1ゃ213=~3\\^_%―$\"#\tわ\n−Z";
my @chars   = split '', $strings;
my $utf8    = find_encoding('utf8');

my $regex_hiragana  = qr/(\p{InHiragana})/;
my $regex_katakana  = qr/(\p{InKatakana})/;
my $regex_jpn_kanji = qr/(\p{InCJKUnifiedIdeographs})/;
my $regex_hankaku   = qr/(\p{InHalfwidthAndFullwidthForms})/; # 半角カナ、全角英数などマッチ
my $regex_numeric   = qr/(\d)/;
my $regex_latin     = qr/(\p{Latin})/; # 全角半角英字にマッチ
my $regex_alphabetical = qr/([A-Za-z])/;
my $regex_control_char = qr/(\s)/;
my $regex_zenkaku_control_char = qr/(\p{InCJKSymbolsAndPunctuation})/; # 全角記号にマッチ

foreach my $char (@chars) {
    if ($char =~ $regex_hiragana) {
        # ひらがな
        print 'Hiragana:       ' . $utf8->encode($1), "\n";
    } elsif ($char =~ $regex_katakana) {
        # かたかな
        print 'Katakana:       ' . $utf8->encode($1), "\n";
    } elsif ($char =~ $regex_jpn_kanji) {
        # 漢字
        print 'JPN Kanji:      ' . $utf8->encode($1), "\n";
    } elsif ($char =~ $regex_zenkaku_control_char) {
        # 全角記号
        print 'Zen Ctr Char:   ' . $utf8->encode($1), "\n";
    } elsif ($char =~ $regex_latin) {
        # 全角半角英字
    } elsif ($char =~ $regex_hankaku) {
        # 半角カナ、全角英数など
        print 'Hankaku:        ' . $utf8->encode($1), "\n";
        print 'Zen Alpha Char: ' . $utf8->encode($1), "\n";
    } elsif ($char =~ $regex_numeric) {
        # 半角数字
        print 'Numeric:        ' . $utf8->encode($1), "\n";
    } elsif ($char =~ $regex_alphabetical) {
        # 半角英字
        print 'Alphabet:       ' . $utf8->encode($1), "\n";
    } elsif ($char =~ $regex_control_char) {
        # 制御文字
        print 'Control char:   ' . $utf8->encode($1), "\n";
    } else {
        # その他
        print 'Other char:     ' . $utf8->encode($char), "\n";
    }
}

出力結果をみると、Unicode Block (ユニコードブロック) で指定する範囲が重なっている文字があり、制御文で判定させる順番に留意した方がよさそう。

Hiragana:       あ
JPN Kanji:      漢
Katakana:       イ
JPN Kanji:      字
Numeric:        0
Hankaku:        キ
Zen Alpha Char: キ
Hankaku:        ゙
Zen Alpha Char: ゙
Other char:     -
Hankaku:        ャ
Zen Alpha Char: ャ
Numeric:        1
Hiragana:       ゃ
Numeric:        2
Hankaku:        1
Zen Alpha Char: 1
Numeric:        3
Other char:     =
Other char:     ~
Hankaku:        3
Zen Alpha Char: 3
Other char:     \
Other char:     ^
Other char:     _
Other char:     %
Other char:     ―
Control char:    
Other char:     #
Control char:   	
Hiragana:       わ
Control char:   

Hankaku:        −
Zen Alpha Char: −