Интерполировать переменную внутри \ N - PullRequest
1 голос
/ 13 июня 2019

Я хочу сделать скрипт, который должен быть в состоянии преобразовать ввод в маленькие заглавные буквы.Я пробовал следующий код

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;

Но я получаю

Неизвестное charname '"LATIN LETTER SMALL CAPITAL $ &"' в строке small.pl 7, внутри строки Executionиз small.pl прервана из-за ошибок компиляции.

Я открыт для других способов сделать это.

Ответы [ 2 ]

5 голосов
/ 13 июня 2019

\N{} является конструкцией времени компиляции. Используйте charnames для поиска символа по имени во время выполнения.

perl -C -mcharnames -E'
    say chr charnames::vianame(
        "LATIN LETTER SMALL CAPITAL " . $_
    ) for qw(I N R)
'
1 голос
/ 13 июня 2019

\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 заменяется .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...