因此,这只是一个修饰点,但是是否有一种简单的方法来按其名称在Perl字符串中插入Unicode字符并使用“ Normal”大小写呢?
Perl包含unicode文字,它们按名称查找代码点,如下所示:
"\N{GREEK SMALL LETTER ALPHA}"
我发现类似以下内容的内容更容易阅读:
"\N{Greek Small Letter Alpha}",
据我所知,Unicode字符名称中不存在最小对。如果角色不存在,是否有一种简洁的方法来命名仍在执行脚本的早期就触发compilation error
的角色?
带有故意拼写错误的字符名称的示例编译错误,这是我不想放弃的检查。
$ echo '%[a]' | ./unicodify
Unknown charname 'GREK SMALL LETTER ALPHA' at ./unicodify line 10, within string
Execution of ./unicodify aborted due to compilation errors.
我正在尝试编写一个小实用程序,以使其更容易在文本文件中输入由%[
和]
分隔的助记符名称的Unicode字符。
这是一个精简的示例,仅替换了%[a]
和%[b]
。
#! /usr/bin/env perl
use strict;
use warnings;
use utf8;
use open ':std' => ':utf8';
my %abbrevs = (
'a' => "\N{GREEK SMALL LETTER ALPHA}",
'b' => "\N{GREEK SMALL LETTER BETA}",
);
while (<>) {
chomp;
my $line = $_;
$line =~ s/(\%\[(.*?)\])/$abbrevs{$2}/g;
print "${line}\n";
}
答案 0 :(得分:7)
引用charnames,
从Perl v5.16开始,双引号字符串中任何出现的
\N{
CHARNAME
}
序列都会自动使用参数{{ 1}}和:full
(如下所述)(如果尚未加载其他参数的话)
其中一个“不同的参数”要求使用松散匹配。
:short
宽松比赛
通过指定
$ perl -CSD -e' use charnames ":loose"; CORE::say "\N{Greek Small Letter Alpha}"; ' α
,将选择Unicode的loose character name matching规则,而不是否则使用的严格精确匹配。这意味着 CHARNAME 不必如此精确地指定。大写/小写无关紧要(上面提到的脚本除外),下划线也不重要,唯一重要的连字符是名称中单词开头或结尾的连字符(一个例外:U中的连字符) +1180:loose
确实很重要)。同样,不与连字符相邻的空格也没关系。正式的Unicode名称在使用连字符和空格来分隔类似单词的单位方面相当可变,并且此选项使您不必太在意。非中间连字符很重要的原因是由于U + 0F60HANGUL JUNGSEONG O-E
与U + 0F68TIBETAN LETTER -A
之类的情况。此处的连字符很重要,前面的空格也很重要,因此必须将两者都包括在内。
TIBETAN LETTER A
与:loose
相比,将查询速度降低了2到3倍,但这种折衷对您来说值得。每个单独的查询花费很少的时间,并且将结果缓存起来,因此,速度差异仅会在执行许多不同拼写的程序中成为一个因素,并且可能仅在通过{{1 }}和:full
,因为vianame()
查找是在编译时完成的。
该模块还提供了用于创建自定义别名的方法。