如何在perl中自动生成的unicode字符范围中跳过保留的unicode字符?

时间:2015-08-20 16:18:34

标签: regex perl unicode

我编写了一个perl程序来自动生成perl中的一系列unicode字符。

#!/bin/perl -w

use strict;
use open qw/:std :encoding(UTF-8)/;

my ($beg, $end, $start, $finish, @chars);

print "Enter the beginning Unicode value of your Language's script: ";
chomp( $beg = <> );

print "Enter the last Unicode value of your Language's script: ";
chomp( $end = <> );

$beg =~ s/U\+(.*)/$1/;
$end =~ s/U\+(.*)/$1/;

$start  = hex($beg);
$finish = hex($end);

@chars = ( $start .. $finish );

foreach (@chars) {

    my $char = chr($_);

    next unless ($char);

    print "$char\n";
}

在使用值U+0B80U+0BFF运行此脚本时,我的输出为:

  

஀஁ஂஃஅஆஇஈஉ஋஌஍எஏஐ஑ஒஓஔக஖஖   ஘஘ஙச஛ஜ஝ட஠஡஢ணணத஥஦஧   ரரறலளழவஷஸஹ஺஻஻஼஽ாி   ைை௉ொோௌ௎௎௎ௐ௑௑௓௓௔௕ௗ௘௘௙௞௞௞   ௠௡௢௣௤௥0 1 2 3 4 5 6 7 8 9௰௱௲௳௴௵௶௶   ௸௹௺௻௼௽௾௿

所有这些框字符都是Unicode Block中的保留空格。

我想删除所有这些保留空格。有没有办法在perl中执行此操作?

线next unless($char)似乎不起作用,因为即使保留空间似乎也有值(方框字符)。

3 个答案:

答案 0 :(得分:6)

您只想打印可见的字符。请here

next unless ($char=~/[[:print:]]/);

答案 1 :(得分:4)

您似乎需要未分配的类别:

next if $char =~ /\p{Unassigned}/;
# Or shorter:
next if $char =~ /\p{Cn}/;

答案 2 :(得分:4)

您也可以使用pragma charnames

use charnames ();
use open qw/:std :encoding(UTF-8)/;

foreach (hex 'B80' .. hex 'B83' ) {
    next unless charnames::viacode($_);
    print chr $_;
}

输出:

ஂஃ

删除next后,它将是:

஀஁ஂஃ

更新:我对Arunesh'schoroba's和我的回答中使用的三种技术进行了基准测试。 charnames显然已经非常糟糕。

use charnames ();
use open qw/:std :encoding(UTF-8)/;
use Benchmark ':all';

cmpthese(
    '-2',
    {
        'charnames' => sub {
            foreach ( hex 'B80' .. hex 'BFF' ) {
                next unless charnames::viacode($_);
            }
        },
        'posix' => sub {
            foreach ( hex 'B80' .. hex 'BFF' ) {
                next unless ( chr($_) =~ /[[:print:]]/ );
            }
        },
        'unassigned' => sub {
            foreach ( hex 'B80' .. hex 'BFF' ) {
                next if ( chr($_) =~ /\p{Cn}/ );
            }
        },
    }
);

__END__
              Rate  charnames      posix unassigned
charnames   28.4/s         --      -100%      -100%
posix      27115/s     95239%         --       -14%
unassigned 31656/s    111205%        17%         --