Size: a a a

2021 January 22

VO

Vyacheslav Olkhovche... in Modern::Perl
Anton Petrusevich
возможно, он просто не меняет флаг с того, что пришло
Что совершенно не интуитивно
источник

SZ

Sergey Zhmylove in Modern::Perl
Anton Petrusevich
возможно, он просто не меняет флаг с того, что пришло
Это не совсем так и мой пример с кодом выше наглядно это показал
источник

AR

Alexander Ru in Modern::Perl
Добрый день всем! Подскажите плз, что я не  так делаю? Есть модуль
package abc;
use Exporter;
our @ISA    = qw( Exporter );
our @EXPORT_OK = qw( ABONENT ..... )

use constant ABONENT => 1;
.....
и есть скрипт, и которого это добро вызывается
use abc;

method(ABONENT, ............

при запуске, выдает
Bareword "ABONENT" not allowed while "strict subs" in use at
источник

AR

Alexander Ru in Modern::Perl
perl -v = v5.24.1
источник

SL

Sergiy Leschenko in Modern::Perl
use abc qw(ABONENT);
источник

AR

Alexander Ru in Modern::Perl
а без qw никак?
источник

SZ

Sergey Zhmylove in Modern::Perl
Alexander Ru
а без qw никак?
Что такое EXPORT_OK и какие ещё бывают?
источник

AR

Alexander Ru in Modern::Perl
Sergey Zhmylove
Что такое EXPORT_OK и какие ещё бывают?
массив литералов
источник

SZ

Sergey Zhmylove in Modern::Perl
Alexander Ru
массив литералов
Я про его название
источник

AR

Alexander Ru in Modern::Perl
If you must export try to use @EXPORT_OK in preference to @EXPORT and avoid short or common symbol names to reduce the risk of name clashes.
источник

SZ

Sergey Zhmylove in Modern::Perl
Alexander Ru
If you must export try to use @EXPORT_OK in preference to @EXPORT and avoid short or common symbol names to reduce the risk of name clashes.
источник

AR

Alexander Ru in Modern::Perl
Спасибо, заработало!
источник

IB

Ivan Bessarabov in Modern::Perl
Oleg Pronin
Я заметил, что многие путаются в utf8 сильно и получают wide character или кракозябры (двойной энкод etc). Хотя тема на самом деле дико простая.
Все что нужно знать:
1) у перла строка может представлять 2 сущности - byte stream и string. is_utf8 говорит какой из режимов включен. В режиме строки просто некоторые функции (substr, lenght И так далее) меняют свой behaviour с побайтового на посимвольный, что занимает дополнительное процессорное время естественно, потому что в пасяти все равно utf8.
2) внутренее представление не изменяется никак при переходе из одного режима в другой. decode_utf8 не делает нихрена кроме как проверяет что там нет инвалидных последовательностей utf8 и переключает режим.
3) чтобы не запутаться где какой режим, простое правило - все что приходит извне (чтение из сокета, файла, stdin, ...) - всегда байтовое. Соответсвенно все что туда отправляется должно быть тоже (иначе будет wide character, однако изза совпадения внутреннего прдставления, все будет работать).
4) еще простое правило - функция is_utf8 за крайне редкими исключениями не должна использоваться. Вы всегда должны знать где у вас байты а где символы. Для этого как правило сразу на входе декодят и в приложении используются символы (кроме случая когда данные бинарные должны быть), и энкодятся в самом конце перед записью в канал.
5) некоторые библиотеки избавляют вас от необходимости энкодить и декодить. Например json::xs::decode_json() ожидает от вас бинарный поток и порождает структуру с символами. А на encode ожидает символы и порождает байты. Обычно это интуитивно логично и ожидаемо.
В случаи работы через обьект JSON::XS->new->utf8->
Метод utf8 как раз заставляет его порождать на декод и ожидать на энкод символы. Если его не писать то в структуре которую вернет декод будут тоже байты (лучше так не делать, только если точно уверены что там только инглиш). Но на вход декод и выход энкод всегда байты, это не меняется, иначе бессмыслица.
Еще например template toolkit аналогично, считывает с диска байты, декодит в символы, ожидает от вас переменные в символах, рендерит и энкодит в байты итоговый результат.
Пункт 1. Тут нет опечатки? Написано "потому что в пасяти все равно utf8.". Не должно быть "все равно байты"?
источник

OP

Oleg Pronin in Modern::Perl
Еще один) utf8 это и есть байты
источник

OP

Oleg Pronin in Modern::Perl
Utf8 = бинарь
источник

OP

Oleg Pronin in Modern::Perl
Символы = unicode/utf32
источник

OP

Oleg Pronin in Modern::Perl
Utf8 это способ представления (сериализации) unicode в байты
источник

VG

Vadim Goncharov in Modern::Perl
Oleg Pronin
6) многие считают что utf8 это символы. Нет. Это байты. Utf8 это способ сериализации кодов юникод, то есть бинарный режим. В перле вообще нет настоящего символьного режима. Он чисто виртуальный (выполняется в рантайме, разбирая каждый байт). Например когда строке в режиме символов говорят substr на 10й символ, перл не может херак и встать на 10й символ сразу как в бинарном режиме, ему придется линейно идти от начала строки отсчитывая символы из байтов.
Настоящий символьный режим был бы если бы перл представлял строку в памяти как utf32 - коды юникода (и памяти занимало бы в 2-4 раза больше, но работало бы быстрее). В перле в режиме символов всегда бинарный режим utf8 под капотом, и виртуальное рантайм эмуляция.
а ведь могли бы как в Swift, где 21-битный тип для Unicode, т.е. по 3 байта сделать...
источник

AK

Andrey Konovalov in Modern::Perl
Коллеги, подскажите, как perl Build.PL'ю указать альтернативный путь установки? PERL_INSTALL_ROOT из документации на ExtUtils::Install что-то не помогает...
источник

AK

Andrey Konovalov in Modern::Perl
Никто ничего? :( Печаль какая...
источник