perl按名称指定unicode字符,而不用大写

时间:2018-12-24 07:25:43

标签: perl unicode

因此,这只是一个修饰点,但是是否有一种简单的方法来按其名称在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";
}

1 个答案:

答案 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 + 0F60 HANGUL JUNGSEONG O-E与U + 0F68 TIBETAN LETTER -A之类的情况。此处的连字符很重要,前面的空格也很重要,因此必须将两者都包括在内。

     

TIBETAN LETTER A:loose相比,将查询速度降低了2到3倍,但这种折衷对您来说值得。每个单独的查询花费很少的时间,并且将结果缓存起来,因此,速度差异仅会在执行许多不同拼写的程序中成为一个因素,并且可能仅在通过{{1 }}和:full,因为vianame()查找是在编译时完成的。

该模块还提供了用于创建自定义别名的方法。