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";
}
池上

引用字符名

从Perl v5.16开始,在双引号字符串中出现的任何序列都会自动将该模块加载有参数,并且(如下所述)会自动加载该模块(如果尚未使用其他参数加载该模块\N{CHARNAME}:full:short

这些“不同的参数”中的一个要求使用松散匹配。

$ perl -CSD -e'
   use charnames ":loose";
   CORE::say "\N{Greek Small Letter Alpha}";
'
α

宽松比赛

通过指定:loose,将选择Unicode的宽松字符名称匹配规则,而不是否则使用的严格精确匹配。这意味着CHARNAME不必如此精确地指定。大写/小写无关紧要(如上所述的脚本除外),下划线也不重要,唯一重要的连字符是名称中单词开头或结尾的连字符(一个例外:U中的连字符) +1180HANGUL JUNGSEONG O-E确实很重要)。此外,不与连字符相邻的空格也没关系。正式的Unicode名称在使用连字符和空格分隔类似单词的单位的位置上是非常可变的,并且此选项使您不必太在意。非中间连字符很重要的原因是由于U + 0F60TIBETAN LETTER -A与U + 0F68之类的情况TIBETAN LETTER A此处的连字符很重要,前面的空格也很重要,因此必须包括两者。

:loose与相比:full将查找速度降低了2到3倍,但这种权衡对您来说值得。每次单独的查询都花费很少的时间,并且将结果缓存起来,因此,速度差异仅会在执行许多不同拼写的程序中成为一个因素,并且可能仅在通过vianame()和进行这些查询时才会出现string_vianame(),因为\N{...}查找在编译时完成。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章