Perl 1 liner: может печатать ввод Unicode, но регулярное выражение не работает;причудливые границы слова - PullRequest
0 голосов
/ 19 сентября 2018

Предположим, у меня есть (в Bash):

txt="На берегу пустынных волн
Стоял он, дум великих полн,
И вдаль глядел."

Если я передам это в Perl, я могу напечатать без проблем:

$ echo "$txt" | perl -lnE 'say "$_"'
На берегу пустынных волн
Стоял он, дум великих полн,
И вдаль глядел.

Но у меня проблемы с различными регулярными выражениямина этом тексте.Предположим, я добавляю новые Fancy Word Boundaries :

$ echo "$txt" | perl -lnE 'while (/\b{wb}(.+?)\b{wb}/g) { print "\"$1\"" }'
"–"
"ù"
"–"
"∞"
" "
"–"
"±"
"–µ—"
"Ä"
...
# junk characters...

Границы слова не работают, а входные символы изменяются.

(Если я изменяю регулярное выражение на/\b{wb}(.+)\b{wb}/g вывод совпадает с первым. (.+) занимает всю строку.)

Я могу исправить эти проблемы, добавив ключ командной строки -CASD играницы причудливых слов работают так, как задумано:

$ echo "$txt" | perl -CSAD  -lnE 'while (/\b{wb}(.+?)\b{wb}/g) { print "\"$1\"" }'
"На"
" "
"берегу"
" "
"пустынных"
" "
"волн"
"Стоял"
" "
"он"
","
" "
"дум"
" "
"великих"
" "
"полн"
","
"И"
" "
"вдаль"
" "
"глядел"
"."

Вопрос: Переключатели -CASD в perlrun , похоже, подразумевают, что включенные функции Unicode предназначены для stdin и stdout входные потоки.Нет никаких упоминаний о каких-либо внутренних различиях, которые могли бы изменить регулярное выражение.Поскольку я могу читать и распечатывать юникод в первом случае, почему добавление -CASD меняет регулярное выражение?

$ perl -v
This is perl 5, version 28, subversion 0 (v5.28.0) built for darwin-thread-multi-2level

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Поскольку я могу читать и распечатывать юникод в первом случае, почему добавление -CASD меняет регулярное выражение?

Эта опция командной строки просто делает perl-декодирование входящих данных, как если быон был в кодировке UTF-8 и перекодировал исходящие данные в виде UTF-8

. Просто чтение текста и печать одного и того же текста с одинаковой кодировкой не требует декодирования и перекодирования потока,поскольку последовательность байтов уже правильно закодирована

Если бы вход был, скажем, в кодировке Windows-1255 (иврит), в то время как выход должен был быть в кодировке UTF-8, тогда данные должны были бы быть декодируется сначала в символьную строку, а затем кодируется в байтовую последовательность UTF-8

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

0 голосов
/ 19 сентября 2018

В первом случае вы не читаете и не печатаете Unicode, вы читаете и печатаете UTF-8.Для Perl эти строки состоят из байтов (октетов), а не символов, поэтому он может найти границы слов в середине многобайтовой последовательности.Подробнее см. perlunicode .

...