2025/06/21(土)PerlでUnicodeの文字集合から特定の部分文字集合を16進数形式で抜き出すやつ

まれによく必要になるのですが、必要になった頃には書き方が思い出せないのでメモ。出力形式などは簡単にカスタマイズできます。

#!/usr/bin/env perl

use strict;
use warnings;
use feature qw/say/;
use utf8;

my $state = 0;

for (0x0000 .. 0x10FFFF)
{
    $_ = chr;
    my $codepoint = sprintf("%04X", ord);

    if (/\p{Han}/)
    {
        print $codepoint if $state == 0;
        $state++;
    }
    else
    {
        if ($state > 1)
        {
            say "\\t$codepoint";
        }
        elsif ($state == 1)
        {
            say "\n$codepoint";
        }

        $state = 0;
    }
}

出力:

2E80\t2E9A
2E9B\t2EF4
2F00\t2FD6
3005
3006
3007
3008
3021\t302A
3038\t303C
3400\t4DB6
4E00\t9FD6
F900\tFA6E
FA70\tFADA
20000\t2A6D7
2A700\t2B735
2B740\t2B81E
2B820\t2CEA2
2F800\t2FA1E