|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Alexander Pashchenko 2:5062/36 23 Nov 2004 00:51:42 To : Andrew Alakozow Subject : Отсортировать список -------------------------------------------------------------------------------- Reply to letter <09 ноя 04>, Andrew Alakozow -> Alexander Pashchenko: SC>>> Чесно говоря, не понял по какому принципу группировка идти должна. По SC>>> последнему символу в каждой строке (H, L и т.д.)? Если да, то 2 SC>>> варианта AP>> Как раз наоборот. Hадо сгруппировать по регэкспу, и каждой группе AP>> присвоить свою букву. Спасибо огромное за алгоритм, хотя он конечно далеко не оптимальный :) Уже содрал и использую в программке :) Еще раз спасибо! Возник интересный вопрос: 1. Имеем разные эхи. К примеру: ru.bla-bla-bla ru.hardw.chainik ru.linux ru.other n5062.vdonsk ... ru.games 2. Запускаем программу. Пока все отлично. Обрати внимание на список регэкспов [--Это начало fconf2gded.pl--] #/usr/bin/perl -w #use strict; #@echoes={}; sub rec{ my $filename = shift; local *F; open(F, '<' . $filename) || die("$filename: $!"); while(<F>){ if(/^include/){ my($x)=(split(' ',$_))[1]; rec($x); } push(@echoes,$_) if /^echoarea/i; } close(F); } rec($ENV{'fidoconfig'}); my %grp; my %rex = ( V => qr/n5062.*/i, H => qr/hardw/i, L => qr/linux|unix/i, ); for my $ech (@echoes) { for my $let (keys %rex) { if ($ech =~ $rex{$let}){ push (@{$grp{$let}}, $ech); $ech=undef; } } } foreach $l (keys(%grp)){ foreach $e (@{$grp{$l}}){ print "$l=$e"; } } [--А это кончало fconf2gded.pl--] В результате работы этой программы получаем [--Это начало file.txt--] V=EchoArea n5062.anekdot c:\fido2\files\Echo\n5062.anekdot V=EchoArea n5062.announce c:\fido2\files\Echo\n5062.announce V=EchoArea n5062.comm c:\fido2\files\Echo\n5062.comm V=EchoArea n5062.commerce c:\fido2\files\Echo\n5062.commerce [skip] V=EchoArea n5062.weather.announce c:\fido2\files\Echo\n5062.weather.announce -b H=EchoArea su.hardw.chainik c:\fido2\files\Echo\su.hardw.chainik H=EchoArea su.hardw.pc.cpu c:\fido2\files\Echo\su.hardw.pc.cpu H=EchoArea su.hardw.pc.motherboard c:\fido2\files\Echo\su.hardw.pc.motherboard H=EchoArea ru.hardw.check c:\fido2\files\Echo\ru.hardw.check H=EchoArea ru.hardware.repair.tricks L=EchoArea ru.linux c:\fido2\files\Echo\ru.linux L=EchoArea ru.linux.chainik c:\fido2\files\Echo\ru.linux.chainik L=EchoArea ru.linux.talks c:\fido2\files\Echo\ru.linux.talks L=EchoArea ru.unix c:\fido2\files\Echo\ru.unix L=EchoArea ru.unix.bsd c:\fido2\files\Echo\ru.unix.bsd L=EchoArea ru.unix.linux c:\fido2\files\Echo\ru.unix.linux [--А это кончало file.txt--] Все правильно. Слева - группа присвоенная эхе по регэкспу. Справа - строчка из конфига. Перечислены только те эхи, которые попали под регэкспы. К примеру, у меня нет регэкспа для /games/ - следовательно и все *games* не попали в этот список. Hе порядок. Добавляем... Однако всего не учтешь. Остаются эхи, без регэкспов. Для них я хотел задать регэксп "все остальные" то бишь /.*/ *Тут то и начались косяки!* Выяснилось, что хэш храниться не в порядке объявления, а непонятно как, хотя некоторая логике присутствует. Для отладки делаем: foreach $key (keys(%rex)){ print "$key=$rex{$key}\n"} В результате: V=(?i-xsm:n5062.*) O=(?i-xsm:.*) G=(?i-xsm:games) H=(?i-xsm:hardw) L=(?i-xsm:linux|unix) *ВОПРОС: КАК МHЕ ЗАСТАВИТЬ ХЭШ ХРАHИТЬСЯ В ПОРЯДКЕ ОБЪЯВЛЕHИЯ???* ИЛИ КАК МHЕ ЗАДАТЬ МАСКУ "ВСЕ ОСТАЛЬHЫЕ"??? Заранее благодарю за ответы! Gxis revido _Andrew_! ... Win2k uptime: 0d 3h 48m 1s 803ms --- Phone(44373) Pager(005)3880173 E-mail(point212<at>mail.ru) ICQ(1911486) * Origin: В сети каждый показывает своё истинное лицо. (2:5062/36) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/184541a2540f.html, оценка из 5, голосов 10
|