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