- Perl. Вопрос по поиску соответствия в строке, user, 19:30 , 11-Мрт-12 (1)
>[оверквотинг удален] > $j++; > } > > $i++; > > } > close (KILL_SES); > Проблема в том, что не получается вычленить искомые строки. Переменные выводит верно, > но в файл-результат ничего не попадает. Где-то я накосячил в проверке, > но где понять не могу.вставте отладочные выводы через print текущих значений переменных. - Perl. Вопрос по поиску соответствия в строке, Square, 02:10 , 12-Мрт-12 (2)
foreach $r (@kill){foreach $t (@ses){if ($t=~/$r/){print $t;}}}Но вообще ваш пример работает. Все он создает...
- Perl. Вопрос по поиску соответствия в строке, Goshik1, 10:20 , 12-Мрт-12 (3)
> foreach $r (@kill){foreach $t (@ses){if ($t=~/$r/){print $t;}}} > Но вообще ваш пример работает. Все он создает...У меня он промежуточные переменные выводит правильно, но в файл-результат не записывает. С Вашим примером тоже (( Вот пример текстовых файлов, чтобы было понятнее. массив kill: username1 username2 массив ses: СЕАНС ПОЛЬЗОВАТЕЛЬ ID СТАТУС ТИП УСТР-ВО console 0 Џ®¤Є«о祮 wdcon rdp-tcp 65538 ЏаЁҐ¬ rdpwd rdp-tcp#31 username1 1 ЂЄвЁў® rdpwd Скрипт должен проверять присутствует ли элемент массива kill (username1) в элементе массива (строке) ses. Т.е. в итоговый файл должна попасть полностью строка: rdp-tcp#31 username1 1 ЂЄвЁў® rdpwd
- Perl. Вопрос по поиску соответствия в строке, PavelR, 10:39 , 12-Мрт-12 (4)
>> foreach $r (@kill){foreach $t (@ses){if ($t=~/$r/){print $t;}}} >> Но вообще ваш пример работает. Все он создает... > У меня он промежуточные переменные выводит правильно, но в файл-результат не записывает. Ты, как программист скрипта, должен понять, что отсутствие вывода в файл может быть по двум причинам : - не срабатывает условие - не производится запись Добавь еще один отладочный print .
- Perl. Вопрос по поиску соответствия в строке, Goshik1, 11:00 , 12-Мрт-12 (5)
>>> foreach $r (@kill){foreach $t (@ses){if ($t=~/$r/){print $t;}}} >>> Но вообще ваш пример работает. Все он создает... >> У меня он промежуточные переменные выводит правильно, но в файл-результат не записывает. > Ты, как программист скрипта, должен понять, что отсутствие вывода в файл может > быть по двум причинам : > - не срабатывает условие > - не производится запись > Добавь еще один отладочный print .Добавил. Я считаю, что не срабатывает условие, потому что нижеприведенный скрипт всегда выдает "Условие не выполнено". Хотя на последних элементах массивов есть совпадение: #Определяем размеры массивов kill и ses $size_k=@kill; $size_s=@ses; print "Размер массива kill: ",$size_k,"\n"; print "Размер массива ses: ",$size_s,"\n"; #Обнуляем счетчик $i=0; while ($i<$size_k) { $temp1=$kill[$i]; print "Текущий элемент массива kill: ",$temp1,"\n"; $j=0; while ($j<$size_s) { $temp2=$ses[$j]; print "Текущий элемент массива ses: ",$temp2,"\n"; if ($temp2=~/$temp1/) { print "Условие выполнено\n"; } else { print "Условие не выполнено \n"; } $j++; } $i++; }
- Perl. Вопрос по поиску соответствия в строке, PavelR, 11:35 , 12-Мрт-12 (6)
>>>> foreach $r (@kill){foreach $t (@ses){if ($t=~/$r/){print $t;}}} >>>> Но вообще ваш пример работает. Все он создает... >>> У меня он промежуточные переменные выводит правильно, но в файл-результат не записывает. >> Ты, как программист скрипта, должен понять, что отсутствие вывода в файл может >> быть по двум причинам : >> - не срабатывает условие >> - не производится запись >> Добавь еще один отладочный print . > Добавил. Я считаю, что не срабатывает условие, потому что нижеприведенный скрипт всегда > выдает "Условие не выполнено". Хотя на последних элементах массивов есть совпадение: Хы. А выводит оно у тебя так: Текущий элемент массива kill: XXXXX [ПУСТАЯ СТРОКА] Текущий элемент массива ses: YYYYY [ПУСТАЯ СТРОКА] Условие не выполнено верно? ;-)
- Perl. Вопрос по поиску соответствия в строке, Goshik1, 11:46 , 12-Мрт-12 (7)
> Хы. > А выводит оно у тебя так: > Текущий элемент массива kill: XXXXX > [ПУСТАЯ СТРОКА] > Текущий элемент массива ses: YYYYY > [ПУСТАЯ СТРОКА] > Условие не выполнено > верно? ;-) Да, нечто вроде было :-) Разобрался, немного переделав скрипт :-) Рабочий скрипт ниже (если кому-нибудь будет интересно): #Открываем файл списка пользователей на отключение и заносим в массив open (KILL,"kill.txt") || die "$!"; @kill=<KILL>; close (KILL); #Открываем файл активных сессий и заносим в массив open (SESSION,"session.txt") || die "$!"; @ses=<SESSION>; close (SESSION); #Открываем файл-результат на запись open (KILL_SES,">kill_ses.txt") || die "$!"; #Определяем размеры массивов kill и ses $size_k=@kill; $size_s=@ses; print "Размер массива kill: ",$size_k,"\n"; print "Размер массива ses: ",$size_s,"\n"; #Обнуляем счетчик $i=0; while ($i<$size_k) { $temp1=$kill[$i]; @words1=map{split ' ',$_} $temp1; # print "words1= ",@words1,"\n"; # print "Текущий элемент массива kill: ",$temp1,"\n"; $j=0; while ($j<$size_s) { $temp2=$ses[$j]; # print "Текущий элемент массива ses: ",$temp2,"\n"; @words2=map{split ' ',$_} $temp2; # print "words2= ",@words2,"\n"; if (grep /@words1/,@words2) { print "Условие выполнено \n"; print KILL_SES $temp2; } else { print "Условие не выполнено \n"; } $j++; } $i++; } close (KILL_SES);
- Perl. Вопрос по поиску соответствия в строке, PavelR, 15:05 , 12-Мрт-12 (8)
>[оверквотинг удален] >> А выводит оно у тебя так: >> Текущий элемент массива kill: XXXXX >> [ПУСТАЯ СТРОКА] >> Текущий элемент массива ses: YYYYY >> [ПУСТАЯ СТРОКА] >> Условие не выполнено >> верно? ;-) > Да, нечто вроде было :-) > Разобрался, немного переделав скрипт :-) > Рабочий скрипт ниже (если кому-нибудь будет интересно): Надо было подчистить концы строк примерно так: $temp1=~s/\r//; $temp1=~s/\n//; ну и во второй переменной аналогично. Хотя в одной из них в общем-то не надо (котораЯ регуляркОЙ проверяется - может содержать конец строки, но матчиться.)
- Perl. Вопрос по поиску соответствия в строке, Goshik1, 15:53 , 12-Мрт-12 (9)
>[оверквотинг удален] >>> верно? ;-) >> Да, нечто вроде было :-) >> Разобрался, немного переделав скрипт :-) >> Рабочий скрипт ниже (если кому-нибудь будет интересно): > Надо было подчистить концы строк примерно так: > $temp1=~s/\r//; > $temp1=~s/\n//; > ну и во второй переменной аналогично. > Хотя в одной из них в общем-то не надо (котораЯ регуляркОЙ проверяется > - может содержать конец строки, но матчиться.) Спасибо, попробую.
- Perl. Вопрос по поиску соответствия в строке, Square, 19:22 , 12-Мрт-12 (10)
>> foreach $r (@kill){foreach $t (@ses){if ($t=~/$r/){print $t;}}} >> Но вообще ваш пример работает. Все он создает... > У меня он промежуточные переменные выводит правильно, но в файл-результат не записывает. > С Вашим примером тоже (( Мой пример в файл ничего не пишет, он выводит на экран. Я написал его только для того чтобы показать вам как легко и просто решается ваша задача без этих ужасных циклов с счетчиками и определением размера массива :) Если! Мой паример! Таки выведет вам на экран строки! то сохранив скрипт в файл можно сделать так: perl скрипт.pl > файл_в котором_сохранится_то_что_он_вывел_на_экран На самом деле, ваш пример, когда его запускаю я, создает файл с правильным содержимым. Промежуточную проверку нужно вставить не только перед проверкой условия, но и в результат проверки условия: # промежуточная проверка print $_; # промежуточная проверка print $temp1; if (/$temp1/) { # промежуточная проверка print $_; # промежуточная проверка print $temp1; print KILL_SES $_; };
|