Как я могу инвертировать строку, которая содержит комбинированные символы в Perl?

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

13
задан brian d foy 28 August 2009 в 19:11
поделиться

3 ответа

Лучший ответ - использовать Unicode :: GCString , , как указывает Синан


Я изменил Немного о примере Часа:

  • Установите кодировку для STDOUT, чтобы избежать предупреждений о "широких символах в печати";
  • Используйте утверждение положительного просмотра вперед (и без режима сохранения разделителя) в split (не работают после 5.10, видимо, поэтому я удалил его)

Это в основном то же самое, но с парой настроек.

use strict;
use warnings;

binmode STDOUT, ":utf8";

my $original = "re\x{0301}sume\x{0301}";
my $wrong    = reverse $original;
my $right    = join '', reverse split /(\X)/, $original;

print <<HERE;
original: [$original]
   wrong: [$wrong]
   right: [$right]
HERE
8
ответ дан 1 December 2019 в 22:07
поделиться

Perl6:: ул. ->reverse также работы.

В случае строки résumé, можно также использовать Unicode::Normalize базовый модуль, чтобы поменять струну к полностью составленной форме (NFC или NFKC) прежде reverse луг; однако, это не общее решение, потому что некоторые комбинации основного символа и модификатора не имеют никакой предсоставленной кодовой точки Unicode.

1
ответ дан 1 December 2019 в 22:07
поделиться

Вы можете использовать \ X специальный escape (сопоставить некомбинирующий символ и все следующие комбинируемые символы) с split , чтобы создать список графем (с пустыми строками между ними), переверните список графем, затем объедините их обратно вместе:

#!/usr/bin/perl

use strict;
use warnings;

my $original = "re\x{0301}sume\x{0301}";
my $wrong    = reverse $original;
my $right    = join '', reverse split /(\X)/, $original;
print "original: $original\n",
      "wrong:    $wrong\n",
      "right:    $right\n";
12
ответ дан 1 December 2019 в 22:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: