Perl определяет Unicode символ по имени, не вводя имя во всех заглавных - PullRequest
0 голосов
/ 24 декабря 2018

Итак, это своего рода косметическая точка, но есть ли простой способ вставить символ юникода по его имени в строку Perl и дать имя «нормальному» регистру?

Perl включает литералы юникодакоторые ищут кодовые точки по имени, как показано ниже:

"\N{GREEK SMALL LETTER ALPHA}"

Мне кажется, что легче читать что-то вроде следующего:

  "\N{Greek Small Letter Alpha}",

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

Я пытаюсь написать небольшую утилиту, чтобы упростить ввод символов юникода в текстовые файлы с помощью мнемонических имен, разделенных %[и ].

Вот чрезвычайно урезанный пример, который просто заменяет %[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 голосов
/ 24 декабря 2018

Цитата charnames ,

Начиная с Perl v5.16, любое появление \N{CHARNAME} последовательностей в двойном-quotish строка автоматически загружает этот модуль с аргументами :full и :short (описано ниже), если он еще не был загружен с другими аргументами

Один из этих "различных аргументов" запрашивает использованиесвободного совпадения.

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

LOOSE MATCHES

При указании :loose вместо 1064 * правил Unicode свободного имени персонажа выбираются правила .используется иначе.Это означает, что CHARNAME не обязательно указывать с такой точностью.Прописные / строчные буквы не имеют значения (за исключением сценариев, упомянутых выше), равно как и подчеркивания, и единственные дефисы, которые имеют значение, это те, которые находятся в начале или в конце слова в имени (за одним исключением: дефис в U+1180 HANGUL JUNGSEONG O-E имеет значение).Кроме того, пробелы, не примыкающие к дефисам, не имеют значения.Официальные имена Unicode весьма различны в отношении того, где они используют дефисы и пробелы для разделения словоподобных единиц, и эта опция позволяет вам не беспокоиться об этом.Причина, по которой немедиальные дефисы имеют значение, заключается в таких случаях, как U + 0F60 TIBETAN LETTER -A против U + 0F68 TIBETAN LETTER A.Дефис здесь важен, как и пространство перед ним, и поэтому оба должны быть включены.

:loose замедляет поиск в 2-3 раза по сравнению с :full, но торговляот вас может стоить это.Каждый отдельный поиск занимает очень мало времени, а результаты кэшируются, поэтому разница в скорости стала бы фактором только в программах, которые выполняют поиск по многим различным написаниям, и, вероятно, только тогда, когда эти просмотры завершены vianame()и string_vianame(), поскольку \N{...} поиск выполняется во время компиляции.

Модуль также предоставляет средства для создания пользовательских псевдонимов.

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