Size: a a a

2020 June 25

MA

Mons Anderson in Modern::Perl
Переслано от Mons Anderson
Кстати в ситуации, когда можно установить правила (например в команде), можно применить ограничение:
Строки: только с флагом (для юникода)
Байты: только без флага. ASCII попадает в байты
Попытка записать "строку" в сокет или ещё что-то подобное вызывает предупреждение с бэктрейсом.
хорошо спасает от проблем конкатенации и "взрывов" при автовзведении флага
Т.е. локально можно политиками сделать себе "правильный" perl
(также можно догадаться, что "бинарные строки с флагом" во первых потребляют вдвое больше памяти, во вторых приблизительно вдвое медленнее работают)
источник

MA

Mons Anderson in Modern::Perl
Переслано от Anton Petrusevich
Да, надо было разделить такие строки. Конкатенация ютф8 без флага и  строки с флагом приводит к печальным результатам
источник

MA

Mons Anderson in Modern::Perl
Переслано от Mons Anderson
в новой парадигме - не приводят. по моему это и было одной из основных мотиваций
источник

a

allter in Modern::Perl
Mons Anderson
Переслано от Anton Petrusevich
Да, надо было разделить такие строки. Конкатенация ютф8 без флага и  строки с флагом приводит к печальным результатам
А ещё есть строки из-под "use utf8;", но без флага что доставляет боооль.
источник

a

allter in Modern::Perl
Mons Anderson
Переслано от Mons Anderson
в новой парадигме - не приводят. по моему это и было одной из основных мотиваций
а что за новая парадигма? вы про 7? пока я там про юникод кроме того, что предлагается в "бойлерплейте по умолчанию" я ничего не вижу...
источник

AU

Alexey Ugnichev in Modern::Perl
allter
а что за новая парадигма? вы про 7? пока я там про юникод кроме того, что предлагается в "бойлерплейте по умолчанию" я ничего не вижу...
Там дата поста есть, 2018 год.
источник

AK

Andrey Konovalov in Modern::Perl
Хм... А нельзя было сказать: "с завтрашнего дня все строки - это utf8, если что-то не так - читай пункт 1-й" ?
Во многих языках именно так
источник

MA

Mons Anderson in Modern::Perl
Mons Anderson
Текущее состояние работы флага UTF8 и функций - это (на мой взгляд) одна из самых больших ошибок в дизайне языка
когда только был внедрён флаг поведение было более корректным, чем сейчас, но позднее кто-то заметил, что
строка с флагом, разбтая посимвольно и дающая массив 1..255 не равна строке без флага, которая при разбитии посимвольно (побайтово) даёт массив 1..255
это не удивительно, т.к внутренний байтовый массив абсолютно разный
лично я считаю, что сделовало сделать одну простую вещь: сказать, что строка с флагом никогда не может равняться строке без флага
благо инструментарий для проверки на флаг уже был.
но было принято другое решение. поведение было названо "The Unicode Bug" и были внесены изменения, которые приводили к равенству таких строк.
после этого стали создаваться сотни реквестов в RT о том, что модуль подвержен "the unicode bug" (мои были в их числе)
длительная переписка с автором этих тикетов не привела ни к чему. мне не удалось убедить его в том, что такое поведение это нонсенс:
$ perl -MDevel::Peek -E '$a = "\N{U+fd}"; $b = "\xfd"; Dump $a; Dump $b; say $a eq $b'
SV = PV(0x7fd2f3806070) at 0x7fd2f382dd48
 REFCNT = 1
 FLAGS = (POK,IsCOW,pPOK,UTF8)
 PV = 0x7fd2f3401b40 "\303\275"\0 [UTF8 "\x{fd}"]
 CUR = 2
 LEN = 10
 COW_REFCNT = 1
SV = PV(0x7fd2f3806120) at 0x7fd2f382dcd0
 REFCNT = 1
 FLAGS = (POK,IsCOW,pPOK)
 PV = 0x7fd2f3401770 "\375"\0
 CUR = 1
 LEN = 10
 COW_REFCNT = 1
1


Поэтому текущая ситуация такая:
- поведение строк в core приведено к duck-typing.
- на флаг UTF8 сказано не обращать внимания (т.е. если вам сказали записать в сокет такую SV'шку,   FLAGS = (POK,IsCOW,pPOK,UTF8) PV = 0x7fd2f3401b40 "\303\275"\0 [UTF8 "\x{fd}", вы должны записать один байт 0xFD)
это невероятно печально, но это факт. можно пытаться отрицать, можно принять, но в любом случае нужно знать как оно есть.

есть 2 категории модулей:
1. old-way модули. которые отрицают существование "байтовых строк с флагом". поэтому при наличии флага строка либо энкодится ("\x{fd}" -> "\303\275"), либо бросается exception
2. new-way модули. которые просто разбирают строку по токенам, и если вдруг им нужны байты, а пришёл "символ" с кодом больше 255, бросается исклчение.
Можно посмотреть сам тред здесь
источник

AK

Andrey Konovalov in Modern::Perl
Впрочем, судя по рантайму кристала того же - это всё равно вынуждает постоянно ощупывать строку на предмет "у тебя там все ASCII? если так, то давай вообще по-другому с тобой работать"
источник

VG

Vadim Goncharov in Modern::Perl
Andrey Konovalov
Хм... А нельзя было сказать: "с завтрашнего дня все строки - это utf8, если что-то не так - читай пункт 1-й" ?
Во многих языках именно так
а с байтами как работать?
источник

MA

Mons Anderson in Modern::Perl
Vadim Goncharov
а с байтами как работать?
убираешь флаг/делашь encode
источник

AK

Andrey Konovalov in Modern::Perl
Vadim Goncharov
а с байтами как работать?
Array(UInt8) :)
Ну на самом деле тупо массив вполне подошёл бы
источник

AK

Andrey Konovalov in Modern::Perl
Без всяких строк
источник

MA

Mons Anderson in Modern::Perl
Andrey Konovalov
Без всяких строк
слишком тяжело по перфу. байтовы строки нужны.
просто не надо давать их клеить с юникодными
источник

VG

Vadim Goncharov in Modern::Perl
Andrey Konovalov
Array(UInt8) :)
Ну на самом деле тупо массив вполне подошёл бы
спасибо, для этого уже есть сишечка
источник

VG

Vadim Goncharov in Modern::Perl
байтовые строки в перле удобнее других языков
источник

AK

Andrey Konovalov in Modern::Perl
Mons Anderson
слишком тяжело по перфу. байтовы строки нужны.
просто не надо давать их клеить с юникодными
Ну тогда уж и типизация нужна, и что-то вроде ByteString vs String
источник

MA

Mons Anderson in Modern::Perl
не нужна. флага достаточно
вы же не просите типизацию number vs string?
источник

AU

Alexey Ugnichev in Modern::Perl
Mons Anderson
слишком тяжело по перфу. байтовы строки нужны.
просто не надо давать их клеить с юникодными
Логично. Иначе ambiguity.
источник

VG

Vadim Goncharov in Modern::Perl
этот щас попросит...
источник