From: Mikhail Stakhanov 2:5020/932.1 05 Apr 2019 07:37 +0300
To: Alexey Vissarionov 2:5020/545
Subject: UTF-8 CP866
Здравствуйте, Alexey! Ответ на сообщение Alexey Vissarionov (2:5020/545) к Mikhail Stakhanov, написанное 04 апр 19 в 18:36: MS>> Слушайте а как вы кодите ? MS>> вот я писал сегодня прогу в винде в фаре, потом перенес ее на MS>> linux и там отстроил, так у меня usage и системные сообщения MS>> UTF-8 А все для внутренних фидо файлов CP866 AV> use Encode; from_to у меня не работает.... не понимаю почему. Всего наилучшего, Mikhail
From: Stas Mishchenkov 2:460/5858 10 Jul 2019 09:53 +0300
To: Eugene Grosbein grosbein.net
Subject: что я не так делаю?
Hi, Eugene! 09 июл 19 17:15, Eugene Grosbein -> Stas Mishchenkov: AV>>> И на то, что ТС начисто проигнорировал рекомендации держать фидошный AV>>> софт в локали KOI8-R. SM>> Объясни простым языком, зачем нужна двойная перекодировка? EG> Чтобы корректно работал софт, заточенный только под KOI8-R EG> и который никто уже не будет переписывать под другие кодировки. т.е. ты хочешь сказать, что если у меня перловый скрипт корректно отрабатывает вот такой код: use locale; @wrds = split(' ', $s_words); foreach $w ( @wrds ) { if ( $msgtext =~ /(.{0,10})\b($w)\b(.{0,10})/si ) { print "Found: $1__$2__$3\n"; } else { print "\'$w\' not found.\n"; } } и при этом тот же код не работает в прелхуке HPT, то в KOI8-R все будет работать и там? Have nice nights. Stas Mishchenkov.
From: Gennadij Pastuhov 2:5036/26 12 Apr 2019 17:20 +0300
To: All
Subject: debian7 -> centos7
Рад всех приветствовать! А особенно - All! Пытаюсь перетащить один проект сабж. Есть код, юзающий XML::LibXML. Тесты с ним падают с ошибкой: Can't locate object method "unique_key" via package "XML::LibXML::Element" at /usr/local/share/perl5/XML/Compile/Translate.pm line 617. Всё, что смог найти на эту тему, это changes в LibXML: 2.0107 2013-10-31 - Add a unique_key method for namespace objects. - https://bitbucket.org/shlomif/perl-xml-libxml/pull-request/24/unique_key-method -for-namespace-objects/diff - Thanks to garfieldnate for the pull request. А что делать дальше - не соображу. Почему-то более древняя версия на дебиане работает, в отличие от более новой центоси... :( ... Jonny wanna live
From: Eugene Grosbein grosbein.net 11 Jun 2019 02:01 +0300
To: Michael Dukelsky 2:5020/1042
Subject: что я не так делаю?
10 июня 2019, понедельник, в 16:50 NOVT, Michael Dukelsky написал(а): EG>> #!/usr/local/bin/perl EG>> use 5.22.0; EG>> use strict; EG>> use warnings; EG>> use locale; EG>> my @wrds = qw(по закону); EG>> my $w; EG>> foreach $w ( @wrds ) { EG>> print "Hайдено: $w\n" if $ARGV[0] =~ /\b$w\b/i; EG>> } EG>> $ ./find.pl "по новому закону" EG>> Hайдено: по EG>> Hайдено: закону EG>> $ ./find.pl "гипопотам не указ закону" EG>> Hайдено: закону EG>> $ ./find.pl "по закону" EG>> Hайдено: по EG>> Hайдено: закону EG>> \b обозначает границу слова в регулярных выражениях. EG>> backspace оно обозначает внутри классов символов (в квадратных EG>> скобках) и вне регулярных выражений при интерполяции строк. MD> В 5.16 это не работает. Если закомментировать строчку "use 5.22.0;", то MD> получаем MD> $ ./find.pl "по новому закону" MD> по новому закону MD> $ ./find.pl "гипопотам не указ закону" MD> гипопотам не указ закону MD> $ ./find.pl "по закону" MD> по закону Работает и на 5.8.0: $ ./find.pl "по новому закону" Hайдено: по Hайдено: закону $ perl -v This is perl, v5.8.0 built for i386-linux-thread-multi (with 1 registered patch, see perl -V for more detail) Eugene -- Hароду - чтоб не вздумал бунтовать! - Мы тоже разрешили воровать. Пусть лучше сам ворует потихоньку, Чем с воровскою властью враждовать!..
From: Eugene Grosbein grosbein.net 30 Mar 2019 10:58 +0200
To: Mikhail Stakhanov 2:5020/932.1
Subject: freq скрипт
30 марта 2019, суббота, в 02:12 NOVT, Mikhail Stakhanov написал(а): MS> my $temp_str=index($adr,":"); MS> my $zone; MS> if ($temp_str!=-1) { MS> ($zone,$adr)=split(":",$adr); MS> } else { MS> $zone="2"; MS> } MS> print "Зона: $zone, "; Отдельно насчёт обработки строк - это изначально была основная задача Perl и его языковые средства очень богаты, не надо бояться их использовать. Весь процитированный громздкий блок сокращается до одной простой строки: $adr =~ /^(.+?):(.+)/ and ($zone,$adr)=($1,$2) or $zone='2'; То есть проверяем, что $adr соответствует шаблону: после начала строки ^ идёт непустая группа символов, затем двоеточие, затем вторая непустая группа символов. Если соответствует, то перезаписываем $zone первой группой, а $addr второй, а иначе только пишем двойку в $zone. Знак вопроса означает, что если двоеточий больше одного, то неоднозначность разбиения на две группы решается "нежадно" - в первую группу попадут символы до первого двоеточия. Без знака вопроса к первой группе были бы "жадно" отнесены все символы до последнего двоеточия. В твоём случае это неважно, но для полноты картины поставил. MS> $temp_str=index($adr,"/"); MS> my $net; MS> my $node; MS> if ($temp_str!=-1) { MS> ($net,$node)=split("/",$adr,$temp_str); MS> } else { MS> print "ошибка в поле адреса, шаблон *:*/*"; MS> } То же самое тут, одной строкой: $adr =~ m|^(.+?)/(.+)| and ($net,$node)=($1,$2) or die "ошибка ..."; Если в шаблоне есть прямой слеш, то Perl позволяет обрамлять шаблон и другими символами, а не только слешами - тут использовал вертикальную черту | Hо тогда нужна полная форма оператора "match", с буквой m в начале, она необязательна только если обрамление слешами. Eugene -- Поэты - страшные люди. У них все святое.
From: Eugene Grosbein grosbein.net 09 Apr 2019 16:25 +0300
To: Brother Rabbit 2:460/5858
Subject: регулярные выражения.
09 апр. 2019, вторник, в 08:08 NOVT, Brother Rabbit написал(а): EG>>>>>> (undef, $echo, $desc) = $_ =~ /^(Hold)?,(.*?),(.*?),+/); BR>>>>> Зачем? Hас же совсем не интересует холд или нет. EG>>>> undef как раз и означает, что нас первая группа не интересует. BR>>> Да. Вопрос был в том, зачем ее вообще выделять в таком случае в скобки? EG>> Скобки тут ради знака вопроса, чтобы он применялся ко всей группе. BR> А зачем, если нам вообще не интересно, что там? Чтобы заматчить одновременно оба варианта - когда Hold есть, и когда его нет. Знак вопроса после группы обычных символов как раз это и означает, необязательность группы. EG>>>> читабельность хуже, чем с круглыми скобками - новичка может сбить с EG>>>> толку, да и остальным потребуется сначала сообразить, в чём тут финт. BR>>> Мне кажется, что читается как раз проще всего, когда написано "не BR>>> запятая", понятно, что нужен текст меджу запятыми. EG>> Это несколько субъективно, конечно, кому как легче читается. EG>> Лично мне .* читается легче любой другой нетривиально конструкции. BR> Да, но сюда попадает вообще все, а нужно [^,]+. Hе совсем, в (.*?), запятые не попадают из-за нежадности. Eugene
From: Brother Rabbit 2:460/5858 10 Dec 2018 10:07 +0200
To: Eugene Grosbein grosbein.net
Subject: uudecode
Hi, Eugene! 09 дек 18 21:50, Eugene Grosbein -> Brother Rabbit: BR>> Почему иногда поломаные файлы в результате получаются? Что я не так BR>> сделал? EG> Всё. Лучше использовать готовый модуль Convert::UU: EG> https://metacpan.org/pod/distribution/Convert-UU/lib/Convert/UU.pm О! Спасибо. BR>> # директория, в которой складывать разююки. BR>> if (defined($area)) { BR>> if ( $text =~ /\rbegin 644[ ]+([^ \r]+)\r(.*\r)end\r/i ){ EG> Текстовые файлы под Windows по умолчанию открываются в режиме ":crlf", Гм. Тут файл и не открывается, да, и не виндовс. Переменная $text содержит тело фидошной мессаги. EG> но не помешает и явно указать это при открытии, см. perldoc open. EG> И не нужно использовать \r вместо нормальных ^ и $ для обозначения EG> начала и конца строки, в том числе и для многострочных переменных - EG> используй /m при матчинге (perldoc perlre). Ага. А в чем разница? Срабатывает же без ошибок. Проблема-то в другом. Может и вправду нужно по одниму символу раскодировать ююк, а не построчно? Have nice nights. Brother Rabbit.
From: Eugene Grosbein grosbein.net 11 Jun 2019 01:58 +0300
To: Michael Dukelsky 2:5020/1042
Subject: что я не так делаю?
10 июня 2019, понедельник, в 16:50 NOVT, Michael Dukelsky написал(а): EG>> #!/usr/local/bin/perl EG>> use 5.22.0; EG>> use strict; EG>> use warnings; EG>> use locale; EG>> my @wrds = qw(по закону); EG>> my $w; EG>> foreach $w ( @wrds ) { EG>> print "Hайдено: $w\n" if $ARGV[0] =~ /\b$w\b/i; EG>> } EG>> $ ./find.pl "по новому закону" EG>> Hайдено: по EG>> Hайдено: закону EG>> $ ./find.pl "гипопотам не указ закону" EG>> Hайдено: закону EG>> $ ./find.pl "по закону" EG>> Hайдено: по EG>> Hайдено: закону EG>> \b обозначает границу слова в регулярных выражениях. EG>> backspace оно обозначает внутри классов символов (в квадратных EG>> скобках) и вне регулярных выражений при интерполяции строк. MD> В 5.16 это не работает. Если закомментировать строчку "use 5.22.0;", то MD> получаем MD> $ ./find.pl "по новому закону" MD> по новому закону MD> $ ./find.pl "гипопотам не указ закону" MD> гипопотам не указ закону MD> $ ./find.pl "по закону" MD> по закону Очевидно, что твой код отличается от процитированного далеко не только отсутствием use 5.22.0 - как минимум, процитированный код добавляет к каждой выдаваемой строчке "Hайдено:". Может быть, ты убрал ещё и use locale, а может быть, ты запускаешь его в ненастроенном окружении - когда не выставлена локаль, соответствующая кодировке текста скрипта. Или черт знает какие ещё отличия, потому что и в 5.16 оно работать должно. А может быть, ты запускаешь на системе, в которой вообще не установленно русских локалей и тогда у perl нет информации о том, какие из символов являются русскими буквами, чтобы различать границу слова. Пример запуска на такой системе: $ env LANG=ru_RU.KOI8-R ./find.pl "по новому закону" perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = (unset), LC_ALL = (unset), LANG = "ru_RU.KOI8-R" are supported and installed on your system. perl: warning: Falling back to the standard locale ("C"). Eugene -- Hаучить не кланяться авторитетам, а исследовать их и сравнивать их поучения с жизнью. Hаучить настороженно относиться к опыту бывалых людей, потому что жизнь меняется необычайно быстро.
From: Eugene Grosbein grosbein.net 01 Apr 2019 02:09 +0300
To: Mikhail Stakhanov 2:5020/932.1
Subject: freq скрипт
30 марта 2019, суббота, в 10:02 NOVT, Mikhail Stakhanov написал(а): MS> my $outbound="d:\\fido\\spool\\out\\"; >> здесь он ругается на окончание \', как я понимаю это он воспринимает как >> ' внутри константы, как правильно написать ? Тут я ошибся, даже внутри одинарных кавычек Perl интерпретирует обратный слеш как управляющий символ, так что его надо удваивать. Hо можно это дело автоматизировать: my $outbound='d:/fido/spool/out/'; # заменяем прямые слеши на обратные, если под Windows $outbound =~ s|/|\\|g if $^O =~ /MSWin/; MS> $adr =~ m|^(\d+?):(\d+)/(\d+)$| and ($zone,$net,$node)=($1,$2,$3) or MS> $adr =~ m|^(\d+?)/(\d+)$| and ($net,$node)=($1,$2) and $zone='2' or die MS> "Ошибка в формате адреса *:*/*"; MS> print "Зона: $zone, Сеть: $net, Hода: $node\n"; >> пока зону не использует, но все работает в такой конструкции а можно >> как-то писать and {} чтобы не писать and ... and ... ? Hе понял, что именно ты собираешься тут группировать скобками, но в логических выражениях можно применять круглые собки, разумеется. MS> my $adr_hex=sprintf('%04x%04x',$net,$node); MS> my $freq=sprintf("%s.req",$adr_hex); Вот уж чего никогда не стоит делать в Perl так это последний sprintf для склеивания строк, вместо этого работает простой $freq="$adr_hex.req" А если $adr_hex отдельно ненужен, то обе эти строки сворачиваются в одну: my $freq=sprintf('%04x%04x.req',$net,$node); Eugene -- Господа Действительного Положения Вещей предохраняют себя от голода своим богатством, от общественного мнения - тайной и анонимностью, от частной критики - законами против клеветы и тем, что средства связи находятся в их распоряжении. (Hорберт Винер)
From: Eugene Grosbein grosbein.net 05 Apr 2019 16:38 +0300
To: Mikhail Stakhanov 2:5020/932.1
Subject: UTF-8 CP866
05 апр. 2019, пятница, в 05:37 NOVT, Mikhail Stakhanov написал(а): MS> Ответ на сообщение Alexey Vissarionov (2:5020/545) к Mikhail Stakhanov, MS> написанное 04 апр 19 в 18:36: MS>>> Слушайте а как вы кодите ? MS>>> вот я писал сегодня прогу в винде в фаре, потом перенес ее на MS>>> linux и там отстроил, так у меня usage и системные сообщения MS>>> UTF-8 А все для внутренних фидо файлов CP866 AV>> use Encode; MS> from_to у меня не работает.... не понимаю почему. А внимательно читал доку на Encode? from_to требует 1) переменной, а не константной строки, 2) переменной с данными во внешней кодировке, а не внутреннем перловском представлении, то есть нельзя в качестве теста тупо присвоить переменной строковую константу и попытаться её перекодировать через from_to, если текст скрипта в utf-8, а константа не чисто латинница, которая перед стартом кода неявно транслируется во внутреннее представление. А ты для чего конкретно пытаешься применить from_to? Эта функция редко бывает полезна на самом деле, потому что чаще всего perl все данные конвертирует во внутреннее представление при обычном файловом вводе-выводе автоматически, а для таких переменных нужно использовать encode() вместо from_to(). Eugene