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