在\ N内插值变量

时间:2019-06-13 07:52:37

标签: regex perl

我想制作一个脚本,该脚本应该能够将输入内容转换为小写字母。 我已经尝试了以下代码

use strict;
use warnings;
use utf8;
use feature qw(say);
binmode STDOUT, ":utf8";
my $text = join '',<STDIN>;
say $text=~s/[a-zA-Z]/\N{LATIN LETTER SMALL CAPITAL $&}/gr;

但我知道

  

small.pl第7行的未知字符名““拉丁字母小写$&”“   字符串中的内容small.pl的执行由于编译错误而中止。

我愿意采取其他方式。

2 个答案:

答案 0 :(得分:5)

\N{}是一个编译时构造。使用charnames在运行时按名称查找字符。

perl -C -mcharnames -E'
    say chr charnames::vianame(
        "LATIN LETTER SMALL CAPITAL " . $_
    ) for qw(I N R)
'

答案 1 :(得分:1)

\N{}是一个编译时构造。因此,一种解决方案是生成代码并对其进行评估。 s////ee的形式对此提供了内置支持。

use open ':encoding(UTF-8)';
use feature qw(say);

my $text = 'A';
say $text =~ s/([a-zA-Z])/ qq{"\\N{LATIN LETTER SMALL CAPITAL $1}"} /eer;

这是如何工作的:

  1. 第一个e使qq{"\\N{LATIN LETTER SMALL CAPITAL $1}"}得到求值,产生"\N{LATIN LETTER SMALL CAPITAL A}"
  2. 第二个e导致"\N{LATIN LETTER SMALL CAPITAL A}"被求值,产生
  3. A替换为
相关问题