我编写了一个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+0B80
和U+0BFF
运行此脚本时,我的输出为:
ஂஃஅஆஇஈஉஎஏஐஒஓஔக ஙசஜடணணத ரரறலளழவஷஸஹாி ைைொோௌௐௗ 0 1 2 3 4 5 6 7 8 9௰௱௲௳௴௵௶௶ ௸௹௺
所有这些框字符都是Unicode Block中的保留空格。
我想删除所有这些保留空格。有没有办法在perl中执行此操作?
线next unless($char)
似乎不起作用,因为即使保留空间似乎也有值(方框字符)。
答案 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's,choroba'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% --