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