From: Eugene Grosbein grosbein.net 04 Apr 2019 18:04 +0300
To: Mikhail Stakhanov 2:5020/932.1
Subject: UTF-8 CP866
03 апр. 2019, среда, в 22:46 NOVT, Mikhail Stakhanov написал(а): MS> Слушайте а как вы кодите ? MS> вот я писал сегодня прогу в винде в фаре, потом перенес ее на linux и там MS> отстроил, так у меня MS> usage и системные сообщения UTF-8 MS> А все для внутренних фидо файлов CP866, ну подправил я 1 раз. а как дальше, MS> перенес работающую версию в винду и не вижу всего utf-8. MS> Я не програмист, просто так увлечение, как вообще этот вопрос правильно MS> решается ? Кодировка самого текста perl-кода, вообще говоря, имеет слабое отношение к кодировке строковых данных, которые этот код обрабатывает, так как perl в любом случае конвертирует строковые данные в своё внутренне представление из "внешней" кодировки, будь это CP866 или CP1251 или UTF-8, ему лишь нужно правильно эту кодировку задать - в том случае, когда кодировка вообще имеет значение - для чисто латинницы (ASCII) не имеет. А текст кода пиши в той кодировке, какая тебе удобней, даже в UTF-8, благо нынче полно редакторов, умеющих редактировать UTF-8 напрямую, включая FAR-овский. Я лично пишу perl-скрипты в KOI8-R :-) Если выберешь не 8-битную кодировку для исходников, а UTF-8, то не забудь добавить use utf8 в начало, чтобы транслятор perl правильно переводил символы UTF-8 из текста кода во внутренне перловское представление во время трансляции исходника как в таких случаях: die "Системная ошибка ..." Eugene -- Choose no career
From: Gennadij Pastuhov 2:5036/26 08 Apr 2019 00:51 +0300
To: Mikhail Stakhanov 2:5020/932.2
Subject: Редактор кода
Рад всех приветствовать! А особенно - Mikhail! Воскресенье апреля 07 19 23:13 Mikhail Stakhanov писал к Gennadij Pastuhov: MS> Я в фаре пока все пишу. Попробуй хотя бы sublime, отличный редактор! MS> И сегодня я осознал что хеш мне не нужен, у меня просто 2х2 таблица, MS> т. е. массив. Но уже индекс допилил. Перепишу потом. Сейчас нужно MS> поиск сделать и можно будет 1ю версию тестировать. :) За неделю MS> допишу. Молодец! ... Jonny wanna live
From: Eugene Grosbein grosbein.net 10 Apr 2019 13:27 +0300
To: Mikhail Stakhanov 2:5020/932.1
Subject: кодировка
09 апр. 2019, вторник, в 20:24 NOVT, Mikhail Stakhanov написал(а): MS> поймал ошибку z2daily.093 != z2daily.093 т.к. "." любой произвольный символ и MS> он должен иметь модификатор ? (правильно ?) Знак вопроса для точки означает необязательность, он тут незачем. MS> и соответственно z2daily[Любой MS> символ]093 должно подходить под z2daily.{1}093, но если мы делаем MS> z2daily\.{1}093 в files[$i] то работает. MS> Так ? $ perl -e 'print "yes\n" if "z2daily.093" =~ /z2daily.093/;' yes Hе нужно добавлять {1}. Eugene
From: Brother Rabbit 2:460/5858 10 Jun 2019 08:39 +0300
To: Eugene Grosbein grosbein.net
Subject: что я не так делаю?
Hi, Eugene! 10 июн 19 03:27, Eugene Grosbein -> Brother Rabbit: BR>> Цель же найти тролько слово целиком. BR>> @wrds = split(" ", $words); BR>> foreach $w ( @wrds ) { BR>> $found = 0 if $text ~= /\b$w\b/i; BR>> } BR>> не находит даже "по закону" EG> Hет, находит - если исправить ошибки (=~ вместо ~=) Опечатка в тексте письма. В коде правильно. EG> и вообще писать аккуратно. И почитать perldoc perlre. Там сказано, что \b{} для юникода работает начиная с версии 5.22. EG> #!/usr/local/bin/perl EG> use 5.22.0; \b тоже только с 5.22 работает? В любом случае, в перлхуке HPT не получается использовать use 5.22.0;, т.к. ругается на необявление всех переменных, в т.ч. и вшитых в HPT перлхук. [...skipped...] EG> \b обозначает границу слова в регулярных выражениях. EG> backspace оно обозначает внутри классов символов (в квадратных скобках) EG> и вне регулярных выражений при интерполяции строк. Вот, а еще сказано, что m// обрабатывается так же, как строка в двойных кавычках и там возможа подстановка переменных. Это меня и смутило. Have nice nights. Brother Rabbit.
From: Brother Rabbit 2:460/5858 01 Apr 2019 11:30 +0300
To: Eugene Grosbein grosbein.net
Subject: freq скрипт
Hi, Eugene! 01 апр 19 15:30, Eugene Grosbein -> Brother Rabbit: BR>> sub getBSOname BR>> { BR>> my ( $addr, $out ) = @_; BR>> $addr =~ /([\d]+)\:([\d]+)\/([\d]+)\.?([\d]*)/; BR>> my ( $zone, $net, $node, $point ) = ( $1, $2, $3, $4 ); BR>> $bsoname = $out; BR>> $bsoname .= ".".sprintf("%03x", $zone) if $zone != $defaultzone; BR>> mkdir $bsoname unless -e $bsoname; BR>> $bsoname .= "\\" if $bsoname =~ /\\/; BR>> $bsoname .= "\/" if $bsoname =~ /\//; BR>> $bsoname .= sprintf("%04x", $net) . sprintf("%04x", $node); BR>> if ( defined ( $point ) && $point != 0 ) { BR>> mkdir $bsoname unless -e $bsoname; BR>> $bsoname .= "\\" if $bsoname =~ /\\/; BR>> $bsoname .= "\/" if $bsoname =~ /\//; BR>> $bsoname .= sprintf( "%08x", $point ); BR>> } BR>> return $bsoname; BR>> } BR>> === Import Windows Clipboard End === BR>> $freqfilename = getBSOname($address, '/home/fido/out/fidonet') . '.req'; BR>> Требуется глобальная переменная $defaultzone. Обычно берется из конфига BR>> или указывается явно прямо в скрипте. EG> И абсолютно никаких проверок. Ну, почти. EG> Что будет, если передан некорректный формат адреса, Считается, что этого не может случиться, т.е. адрес передается заведомо правильный (уже проверен на корректнось). EG> или формат корректный, но на месте создаваемого каталога EG> уже есть такое имя, только это обычный файл? Да. Тут косяк. В BSO, кстати, это вполне может случиться. EG> Я уж не говорю о странном склеивании sprintf("%04x", $net) . EG> sprintf("%04x", $node) вместо одного простого вызова sprintf("%04x04x", EG> $net, $node), Спасибо. Я не знал, что так можно. EG> и четырехкратного поиска слешей в $bsoname вместо однократного. Согласен. # считается, что аутбаунд уже проверен на корректность. $slash = $1 if $out =~ /([\\\/])/; # [...skipped...] $bsoname .= $slash; Have nice nights. Brother Rabbit.
From: Eugene Grosbein grosbein.net 06 Apr 2019 09:26 +0300
To: Mikhail Stakhanov 2:5020/932.1
Subject: UTF-8 CP866
05 апр. 2019, пятница, в 21:15 NOVT, Mikhail Stakhanov написал(а): MS> может есть идеи как хранить индекс по-другому ? Прежде чем придумывать индекс, надо чётко сформулировать, а зачем он нужен: какие операции над индексируемыми данным вообще будут выполняться (не забыть про пополнение индекса) и какие из них чаще всего? MS> там будет вопрос еще системный, а если в индексе будет подмаунченый каталог MS> ntfs с cp1251 ? Если в исходных данных нет однозначности в кодировке в виде метаданных каких-нибудь (типа mime-type или ещё как) и выбор стоит между utf-8 и однобайтной кодировкой 1251, я обычно делаю так: use Encode; # в $_ исходные данные во внешней кодировке $tmp = $_; # конвертируем во внутреннее представление $_ = utf8::decode($tmp) ? $tmp : Encode::decode('windows-1251', $_, Encode::FB_PERLQQ); # конвертируем из внутреннего представления в UTF-8 utf8::encode($_); При этом use utf8 использовать необязательно. Как это работает: делаем копию строки и пытаемся её перевести из UTF-8 в перловское внутреннее представление функцией utf8::decode($tmp), которая преобразует свой аргумент и возвращает логическую истину, если преобразование удалось, то есть если исходные данные действительно были корректным UTF-8, и тогда мы замещаем $_ полученным внутренним представлением и можем работать с ней как с перловой строкой. А если преобразование было не успешным, то предполагаем 1251 и конвертируем из 1251 опять же во внутреннее перловое представление. Затем utf8::encode($_) преобразует в UTF-8, если надо. Eugene
From: Michael Dukelsky 2:5020/1042 10 Jun 2019 23:03 +0300
To: Eugene Grosbein grosbein.net
Subject: что я не так делаю?
Привет, Eugene! 11 June 2019 01:58, Eugene Grosbein послал(а) письмо к Michael Dukelsky: EG> Очевидно, что твой код отличается от процитированного EG> далеко не только отсутствием use 5.22.0 Да, действительно, я добавил print "$ARGV[0]\n"; а потом меня отвлекли и я забыл про эту строчку. #!/usr/bin/perl #use 5.22.0; use strict; use warnings; use locale; print "$ARGV[0]\n"; my @wrds = qw(по закону); my $w; foreach $w ( @wrds ) { print "Найдено: $w\n" if $ARGV[0] =~ /\b$w\b/i; } То есть получается, что ничего не найдено. EG> Может быть, ты убрал ещё и use locale, EG> а может быть, ты запускаешь его в ненастроенном окружении - EG> когда не выставлена локаль, соответствующая кодировке EG> текста скрипта. Или черт знает какие ещё отличия, EG> потому что и в 5.16 оно работать должно. $ locale LANG=ru_RU.UTF-8 LC_CTYPE="ru_RU.UTF-8" LC_NUMERIC="ru_RU.UTF-8" LC_TIME=ru_RU.UTF-8 LC_COLLATE="ru_RU.UTF-8" LC_MONETARY="ru_RU.UTF-8" LC_MESSAGES=ru_RU.UTF-8 LC_PAPER="ru_RU.UTF-8" LC_NAME="ru_RU.UTF-8" LC_ADDRESS="ru_RU.UTF-8" LC_TELEPHONE="ru_RU.UTF-8" LC_MEASUREMENT="ru_RU.UTF-8" LC_IDENTIFICATION="ru_RU.UTF-8" LC_ALL= Желаю успехов, Eugene! За сим откланиваюсь, Michael. ... node (at) f1042 (dot) ru
From: Eugene Grosbein grosbein.net 01 Apr 2019 15:20 +0300
To: Mikhail Stakhanov 2:5020/932.1
Subject: freq скрипт
31 марта 2019, воскресенье, в 20:29 NOVT, Mikhail Stakhanov написал(а): MS>>> $adr =~ m|^(\d+?):(\d+)/(\d+)$| and ($zone,$net,$node)=($1,$2,$3) MS>>> or MS>>> $adr =~ m|^(\d+?)/(\d+)$| and ($net,$node)=($1,$2) and MS>>> $zone='2' or die "Ошибка в формате адреса *:*/*"; print "Зона: MS>>> $zone, Сеть: $net, Hода: $node\n"; >>>> пока зону не использует, но все работает в такой конструкции а >>>> можно как-то писать and {} чтобы не писать and ... and ... ? MS> and ... and ... and ... Это не просто перечисление операторов - это вычисление логического выражения, причём если одно из двух или более условий, соединённых and, окажется ложным, то второе даже не будет вычисляться. У каждого присвавания в Perl, как и в C (но в отличие от Pascal), есть "результат": то значение, которое было присвоено, и вот этот результат тоже оценивается как логическая истина или ложь. Ложью в Perl считается неопределённое значение undef, целочисленный ноль (0) и пустая строка, а всё остальное - истиной. Так что, когда Perl исполняет эту строку: $adr =~ m|^(\d+?)/(\d+)$| and ($net,$node)=($1,$2) and $zone='2'; он не просто выполняет подряд эти операторы, а именно оценивает их логические значения: первый оператор =~ сам по себе логический, проверка на соответствие шаблону и если он вернул истину, то выполняется присваивание списку, а затем список конвертируется в скалярный контекст - от него берётся длина - и эта длина тут всегда 2, то есть не ложь, поэтому и третий оператор тоже выполняется и результат его непустая строка '2' - тоже не ложь, так что всё выражение целиком истина и альтернатива после or не будет исполняться. Формально говоря, есть возможность выполнить в логическом выражении несколько операторов "подряд", не связывая их все через and и не проверяя значение каждого, если использовать оператор "запятая": $adr =~ m|^(\d+?)/(\d+)$| and ( ($net,$node)=($1,$2), $zone='2' ) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ вот эта Это всё ещё корректное логическое выражение и исполняться оно будет почти так же, за тем исключением, что запятая всегда исполняет все перечисленные операторы, игнорируя их значания, кроме значения последнего - оно используется как итоговое значение всей конструкции во внешних скобках. В данном случае это будет '2', то есть истина. Hо выглядит это хуже, чем исходный вариант. Eugene
From: Alexey Vissarionov 2:5020/545 04 Apr 2019 18:36 +0300
To: Mikhail Stakhanov 2:5020/932.1
Subject: UTF-8 CP866
Доброго времени суток, Mikhail! 04 Apr 2019 00:46:04, ты -> All: MS> Слушайте а как вы кодите ? MS> вот я писал сегодня прогу в винде в фаре, потом перенес ее на linux и MS> там отстроил, так у меня usage и системные сообщения UTF-8 А все для MS> внутренних фидо файлов CP866 use Encode; -- Alexey V. Vissarionov aka Gremlin from Kremlin gremlin ПРИ gremlin ТЧК ru; +vii-cmiii-ccxxix-lxxix-xlii ... Облачных технологий не существует - существуют только чужие компутеры
From: Gennadij Pastuhov 2:5036/26 28 Jan 2019 17:44 +0200
To: All
Subject: +key => +value
Рад всех приветствовать! А особенно - All! Иногда встречаю в коде выражения вида: { -key => "value", } upd: или { response => '+response', } С этим разобрался, просто строка :) А вот минус в ключе - пока загадка. ... Jonny wanna live