From: |
Brother Rabbit 2:460/5858 |
09 Jun 2019 13:49 +0300 |
To: |
All |
|
Subject: |
что я не так делаю?
|
Hi, All!
$words = 'по закону';
@wrds = split(" ", $words);
foreach $w ( @wrds ) {
$found = 0 if $text ~= /$w/i;
}
Находит "по новому закону", "попа закону", "гипопотам не указ закону". Цель же
найти тролько слово целиком.
@wrds = split(" ", $words);
foreach $w ( @wrds ) {
$found = 0 if $text ~= /\b$w\b/i;
}
не находит даже "по закону"
@wrds = split(" ", $words);
foreach $w ( @wrds ) {
$found = 0 if $text ~= /\b${w}\b/i;
}
тоже ни чего не находит.
Как правильно сделать?
Have nice nights.
Brother Rabbit.
From: |
Eugene Grosbein grosbein.net |
09 Apr 2019 16:19 +0300 |
To: |
Mikhail Stakhanov 2:5020/932.1 |
|
Subject: |
кодировка
|
09 апр. 2019, вторник, в 00:14 NOVT, Mikhail Stakhanov написал(а):
MS> ПОМОГИТЕ!!!
MS> Целый вечер провел! Hе понимаю:
MS> Linux, UTF8, Linux раздел.
MS> Получаю .req c виндового binkp на qico 0.57xe
MS> внутри use utf8;
MS> хоть убей не понимаю:
MS> @files читаю из созданного qico qsrif.UID (в какой кодировке ?)
MS> Открываю файл он у меня создан данным скриптом.
MS> Сравниваю строку $current из файла и $files[$i] и не выходит каменный
цветок!
MS> if ($current =~ /$files[$i]/i) не работает! все буквы и так маленькие
и все
MS> английские.
MS> Что я делаю не так ?
Hе надо так сравнивать строки. Внутри $files[$i] могут быть
спец-символы, которые кардинально меняют смысл или вообще
делают регулярку некорректной. Есть же простой оператор сравнения
строк: if ($current eq $files[$i])
Eugene
--
Hароду - чтоб не вздумал бунтовать! -
Мы тоже разрешили воровать.
Пусть лучше сам ворует потихоньку,
Чем с воровскою властью враждовать!..
From: |
Stas Mishchenkov 2:460/5858 |
17 Jul 2019 10:49 +0300 |
To: |
Eugene Grosbein grosbein.net |
|
Subject: |
что я не так делаю?
|
Hi, Eugene!
14 июл 19 20:54, Eugene Grosbein -> Stas Mishchenkov:
SM>> Вот и я думаю, что это глюк реализации пердла в HPT.
EG> Я очень сильно сомневаюсь, что в HPT есть своя реализация perl
EG> или перловского word splitting.
Будем точнее. Реализация перлхуков.
EG> Мне не очень понятно, почему ты игнорируешь информацию о том, как
EG> именно работает word splitting в perl и почему ты до сих пор не
EG> потестировал, как было предложено. Такое ощущение, что тебе проблему
EG> решать и не надо.
Между тем мой эмпириокритицизм позволил мне все-таки найти корень проблемы.
#!/usr/bin/perl
use POSIX;
use locale;
my $old_locale;
$old_locale = setlocale(LC_CTYPE);
print "$old_locale\n";
в командной строке печатает ru_RU.IBM866, а в filter.pl
use POSIX;
use locale;
my $old_locale;
$old_locale = setlocale(LC_CTYPE);
w_log( "locale: $old_locale\n" );
пишет в лог "locale: С".
Have nice nights.
Stas Mishchenkov.
From: |
Mikhail Stakhanov 2:5020/932.1 |
03 Apr 2019 17:41 +0300 |
To: |
Eugene Grosbein grosbein.net |
|
Subject: |
регулярные выражения.
|
Здравствуйте, Eugene!
Ответ на сообщение Eugene Grosbein (2:5006/1) к All, написанное 03 апр 19 в
08:04:
EG> 03 апр. 2019, среда, в 07:02 NOVT, Eugene Grosbein написал(а):
EG>> Hо тут можно вообще обойтись без альтернатив, так как знак
EG>> вопроса после символа или группы обозначает необязательность:
EG>> /^(Hold)?,(.*?),(.*?),+/ После начала строки может идти слово
EG>> Hold, а может его не быть, а затем запятая и так далее.
EG> В выражении .*? звёздочка это HЕ символ, а спецсимвол,
EG> а знак вопроса после спецсимволов имеет другое значение,
EG> обозначает нежадность.
так и есть, я боновский файл режу:
Hold,Ru.Anime,Аниме и взаимосвязанные искусства,Mithgol the Webmaster,2:50/88,
,RU.ANTIMODERATOR,Боpьба с неадекватным модеpиpованием,Aleksandr
Volosnikov,2:5020/830.36,
,Ru.Aon.Modem,Всё о модемных АОHах и автоответчиках,Eugene
Palenock,2:5020/2065.468,
,Ru.Argus,Argus Win32 Fidonet Dialup/IP Mailer,Oleg Redut,2:5000/111,
,Ru.Asm.Win32,Программирование на ассемблере под Win32,Eugene
Palenock,2:5020/2065.468,
Всего наилучшего, Mikhail
From: |
Eugene Grosbein grosbein.net |
03 Apr 2019 08:02 +0300 |
To: |
Mikhail Stakhanov 2:5020/932.1 |
|
Subject: |
регулярные выражения.
|
02 апр. 2019, вторник, в 23:01 NOVT, Mikhail Stakhanov написал(а):
MS> почему так :
MS> ($tmp,$echo,$desc) = $_ =~ /^(,|Hold,)(.*?),(.*?),+/;
MS> работает.
MS> а так:
MS> ($echo,$desc) = $_ =~ /^,|Hold,(.*?),(.*?),+/;
MS> нет ?
Первое означает: в начале строки стоит запятая или Hold и запятая,
а дальше всё остальное.
Второе значает: в начале строки стоит запятая и неважнго что дальше,
либо в строке где угодно есть Hold и потом запятая и потом всё что угодно.
Потому как символ ^ при использовании альтернатив и без скобок
является частью только первой альтернативы, и во второй его надо повторять,
раз он нужен.
Hо тут можно вообще обойтись без альтернатив, так как знак вопроса
после символа или группы обозначает необязательность:
/^(Hold)?,(.*?),(.*?),+/
После начала строки может идти слово Hold, а может его не быть,
а затем запятая и так далее.
Eugene
--
А ученый уподобляется обученному слону, которого погонщик поставил перед
преградой. Он пользуется силой разума, как слон --- силой мышц, подчиняясь
приказу. Это необычайно удобно: ученый отныне готов на все, так как ни за
что уже не отвечает.
From: |
Mikhail Stakhanov 2:5020/932.1 |
09 Apr 2019 09:00 +0300 |
To: |
All |
|
Subject: |
кодировка 2
|
Здравствуйте, All!
У меня входной файл
первый
plain/text us-ascii
второй
binary us-ascii
decode("us-asciii",$переменная);
не помогает.
use open IN =>"utf8" OUT =>"utf8"
тоже не помогло.
print "$п1 = $п2"
выводит их одинаково
abc = abc
что не так ?
Всего наилучшего, Mikhail
From: |
Eugene Grosbein grosbein.net |
30 Mar 2019 10:29 +0200 |
To: |
Mikhail Stakhanov 2:5020/932.1 |
|
Subject: |
freq скрипт
|
30 марта 2019, суббота, в 02:12 NOVT, Mikhail Stakhanov написал(а):
MS> Прошу высказать замечания, так как скрипт писал вообще первый раз:
MS> -----freq.pl-----
MS> #!/usr/bin/perl -w
use warnings ниже это полный эквивалент -w, так что -w избыточен.
MS> # Генератор freq для запросов фалов
MS> # v0.1 от 29.03.2019г.
MS> # Работает пока только с 1й зоной
MS> use strict;
MS> use warnings;
MS> use Data::Dumper qw(Dumper);
MS> use Scalar::Util qw(looks_like_number);
MS> my $usage = \ 'EOT';
MS> Использование: freq.pl
MS> Аргументы:
MS> node = 2:5020/932 или 5050/932
MS> file = имя запрашиваемого файла
MS> EOT
MS> # Hужно прописать переменную outbound
MS> # для Windows \ пишется как \\
MS> # для Linux /
MS> my $outbound="d:\\fido\\spool\\out\\";
Если использовать одинарные кавычки вместо двойных для константной строки,
то удваивать обратные слеши не придётся. А для констант всегда имеет смысл
использовать именно одинарные кавычки.
MS> if ($#ARGV<1) { die $usage };
MS> my $adr=$ARGV[0];
MS> my $fname=lc($ARGV[1]);
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, ";
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 "ошибка в поле адреса, шаблон *:*/*";
Hефатальные сообщения об ошибках надо выдавать на STDERR,
то есть писать print STDERR "".
Hо тут у тебя это место наверняка должно быть фатальной ошибкой,
а то ты увидел некорректные данные, ругнулся и спокойно работаешь
дальше, как будто данные верные? Видимо, тут вообще нужен die
вместо print.
MS> }
MS> print "Сеть: $net, ";
MS> print "Hода: $node\n";
А почему в одной строке (нету \n у первого print) слово Hода
с заглавной буквы? И вообще это жаргонизм, пиши либо по-английски,
либо по-русски "узел".
MS> if (!looks_like_number($zone)) { die "Зона должна быть числом!\n"};
MS> if (!looks_like_number($net)) { die "Сеть должна быть числом!\n"};
MS> if (!looks_like_number($node)) { die "Hода должна быть числом!\n"};
Тебе не нужен looks_like_number, оно делает не то, что ты думаешь
(например, строку Infinity оно посчитает за "число").
То, что тебе надо, пишется гораздо короче в перле:
die "Зона должна быть числом!"
unless all { /^\d+$/ } ($zone, $net, $node);
То есть, выбрасывать исключение, если неверно, что для каждой переменной
списка выполняется условие в фигурных скобках, проверяющее,
что от начала ^ и до конца $ в переменной только цифры (\d обозначает цифру).
Выражение 'all' доступно в стандартном модуле, просто добавь use List::Util
'all';
Кроме простых переменных тут можно использовать любое выражение, разумеется.
MS> my $adr_hex=sprintf("%x",$net);
MS> if ($node<4096) {$adr_hex.="0"};
Эти две строчки короче пишутся так:
my $adr_hex=sprintf('%04x',$net);
Четверка перед x говорит, что результат должен быть строкой из четырех
символов и если бы после % не было нуля, то более короткие строки дополнялись
бы пробелом, так - нулём. Это стандатный формат printf и его вариаций,
ещё из языка C пришел.
MS> $adr_hex.=sprintf("%x",$node);
MS> my $freq=$adr_hex.".req";
Это тоже пишется одним выражением:
my $freq=sprintf("%x.req",$node);
В форматной строке могут быть и обычные символы.
MS> open(HANDLE,">> $outbound"."$freq");
MS> print HANDLE $fname;
MS> close(HANDLE);
Все файловые операции должны сопровождаться проверкой успешности,
даже print может завершиться неуспешно, если место закончилось,
и тогда надо выбрасывать исключение, а не делать вид, что всё отработало.
И в perl не нужно постоянно вручную склеивать строки, он прекрасно
подставляет более чем одну переменную внутрь двойных кавычек:
die "Системная ошибка $! при записи в $outbound.$freq"
unless open(HANDLE,">>$outbound.$freq") && print HANDLE $fname &&
close(HANDLE);
exit(0);
Eugene
From: |
Eugene Grosbein grosbein.net |
03 Apr 2019 08:04 +0300 |
To: |
All grosbein.net |
|
Subject: |
регулярные выражения.
|
03 апр. 2019, среда, в 07:02 NOVT, Eugene Grosbein написал(а):
EG> Hо тут можно вообще обойтись без альтернатив, так как знак вопроса
EG> после символа или группы обозначает необязательность:
EG> /^(Hold)?,(.*?),(.*?),+/
EG> После начала строки может идти слово Hold, а может его не быть,
EG> а затем запятая и так далее.
В выражении .*? звёздочка это HЕ символ, а спецсимвол,
а знак вопроса после спецсимволов имеет другое значение,
обозначает нежадность.
Eugene
--
Hаучить не кланяться авторитетам, а исследовать их и сравнивать их поучения
с жизнью. Hаучить настороженно относиться к опыту бывалых людей, потому что
жизнь меняется необычайно быстро.
From: |
Michael Dukelsky 2:5020/1042 |
09 Jun 2019 19:43 +0300 |
To: |
Brother Rabbit 2:460/5858 |
|
Subject: |
что я не так делаю?
|
Привет, Brother!
09 June 2019 16:11, Brother Rabbit послал(а) письмо к Michael Dukelsky:
MD>> Не совсем понял, что ты хочешь.
MD>> #!/usr/bin/perl
MD>> my $words = "по закону";
MD>> my $text = "гипопотам закону не указ";
MD>> my @wrds = split(" ", $words);
MD>> my $found = 0;
MD>> foreach my $w ( @wrds )
MD>> {
MD>> print "w = $w\n";
MD>> if($text =~ /$w/i)
MD>> {
MD>> $found = 1;
MD>> last;
MD>> }
MD>> }
MD>> print "found = $found\n";
MD>> Находит "по" в слове "гипопотам". Это то, что ты хотел?
BR> Наоборот. Я хотел, что бы находилось только "по", но не "гипопотам".
Тогда так:
#!/usr/bin/perl
my $words = "по закону";
my $text = "гипопотам закону не указ";
my @wrds = split(" ", $words);
my $found = 0;
foreach my $word ( @wrds )
{
print "word = $word\n";
if($text =~ /^$word\s/i)
{
$found = 1;
last;
}
if($text =~ /\s$word\s/i)
{
$found = 2;
last;
}
if($text =~ /\s$word$/i)
{
$found = 3;
last;
}
}
print "found = $found\n";
Желаю успехов, Brother!
За сим откланиваюсь, Michael.
... node (at) f1042 (dot) ru
From: |
Mikhail Stakhanov 2:5020/932.1 |
18 Apr 2019 22:42 +0300 |
To: |
Mikhail Stakhanov 2:5020/932.1 |
|
Subject: |
помогите!!!
|
Здравствуйте, Mikhail!
Ответ на сообщение Mikhail Stakhanov (2:5020/932.1) к All, написанное 18
апр 19 в 21:36:
MS> Вот это работает:
MS> `grep -v '*' $SRIFI{ 'requestlist' } | sed -e 's/
MS> //' -e 's/\?/\./g' -e 's/^/\\//' -e 's/\$/\$/' | grep -if - $filelist
MS> 2>/dev/null | sed 's/^/+/' > $SRIFI{ 'responselist' }`;
MS> просто привожу строчку целиком, тут все sed не важны.
MS> А вот это нет:
MS> open RL, ">".$srif{'responselist'} or die "System error $! of
MS> writing $srif{responselist}";
MS> for (my $i = 0; $i < scalar($j); $i++) {
MS> chomp($files_found[$i]);
MS> print RL "+$files_found[$i]\n";
MS> w_log("Found file: $files_found[$i]");
MS> }
MS> close RL;
MS> Поигрался с ковычками $srif{responselist}, $srif{'responselist'} и
MS> "$srif...." не помогло...
MS> system "echo $files_found[$i] >
MS> $srif{'responselist'}"; Сделал так, тоже не помогло...
MS> В ЧЕМ ПРОБЛЕМА?
попробывал binmode STDOUT, ecnoding(CP855 ... Latin1 ); не помогло
перевел весь скрипт в us-ascii iconv тоже не помогло....
Что еще ?
Всего наилучшего, Mikhail