Как я соответствую только полностью составленным символам в строке Unicode в Perl?

Решено.

Как отмечалось в комментариях, проблема заключалась в том, что я неправильно обращался к ViewController.

Чтобы получить доступ к моему ViewController вне класса ViewController, я создал его новый экземпляр с помощью ViewController().

Я решил это, поместив функцию внутри класса и изменив часть ViewController() на self.ViewController.

Этот ответ также помог мне. https://stackoverflow.com/a/45932084/7414387

8
задан tchrist 29 March 2012 в 18:22
поделиться

5 ответов

echo あ| perl -nle 'BEGIN{binmode STDIN,":utf8"} print"[$_]"; print /[[:print:]]/ ? "YES" : "NO"'

Это главным образом работает, хотя это генерирует предупреждение о широком символе. Но это дает Вам идею: необходимо быть уверены, что Вы имеете дело с реальной строкой unicode (проверьте utf8:: is_utf8). Или просто проверьте perlunicode вообще - целый предмет все еще заставляет мою голову кружиться.

6
ответ дан 5 December 2019 в 09:26
поделиться

Да, те выражения являются иждивенцем локали.

2
ответ дан 5 December 2019 в 09:26
поделиться

Я думаю, что Вы не хотите или нуждаетесь в локалях для этого, но, а скорее Unicode. Если Вы декодировали текстовую строку, \w будет соответствовать словесным символам на любом языке, \d соответствия не просто 0..9 но каждая цифра Unicode и т.д. В regexes можно запросить свойства Unicode с \p{PropertyName}. Особенно интересный для Вас мог бы быть \p{Print}. Вот список всех доступных свойств символа Unicode.

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

Обновление: с Unicode Вы не получаете языковозависимое поведение, но вместо этого нормальные значения по умолчанию независимо от языка. Это может или не может быть тем, что Вы хотите, но для различия priintable/control символа я не вижу, почему Вам было бы нужно языковозависимое поведение.

5
ответ дан 5 December 2019 в 09:26
поделиться

Вы могли всегда использовать класс символов [^[:cntrl:]] соответствовать неуправляющим символам.

1
ответ дан 5 December 2019 в 09:26
поделиться

\X соответствует полностью составленному символу (последовательности). Доказательство:

#!/usr/bin/env perl
use 5.010;
use utf8;
use Encode qw(encode_utf8);

for my $string (qw(あ ご ご), "\x{3099}") {
    say encode_utf8 sprintf "%s $string", $string =~ /\A \X \z/msx ? 'ok' : 'nok';
}

Тестовыми данными являются: нормальный символ, предкомбинированный символ, комбинированная символьная последовательность и комбинированный символ (что само по себе "не считается", упрощение Главы 3 Юникода).

Замените \X на [[:print:]], чтобы увидеть, что ответ Танктала приводит к ложным совпадениям для двух последних случаев.

4
ответ дан 5 December 2019 в 09:26
поделиться
Другие вопросы по тегам:

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