>Работа с массивами в перл - полнейший отстой.
>Чего стоит несоблюдение последовательности обхода ключей в массиве в цикле foreach. Костыли, костыли... Весь язык - один большой костыль.
с этого места пожалста подробнее. это похоже на кто-то не вкуривает, а критиковать любит (3.14здит попросту)
"Чего стоит несоблюдение последовательности обхода ключей
в массиве в цикле foreach" пример в студию - пока не докажешь, буду думать, что костыль только писателя у которого было несоблюдение :)
хы, че на цпане лежит - во всю жисть не усвоишь, тем паче без знания англицкого :) Мне вот надо имаджи обрабатывать, напишу алгоритм на перле максимально просто (пусть и длинно), потом сяду с сишным программистом и буду с ним писать на сях...
>>Кхе-кхе ;)
В пхп это делается так:
array_intersect()
array_merge()
>>А как на счет array_diff() ? Работа с массивами в перл - полнейший отстой. Чего стоит несоблюдение последовательности обхода ключей
в массиве в цикле foreach. Костыли, костыли... Весь язык - один большой
костыль.
Люблю таких идиотиков :-)). В PHP нет нормальных массивов в общепринятом смысле. В нем есть только связка хешь-массив. Поэтому и нужно так моного всего. Иначе невозможноно было бы работать с ним вообще.
вот мой префоркед сервер (на 70% слизан с одной книжки).
Что он делает. есть некая другая прога, которая пишет в конец файла
информацию, которую надо отправлять на порт. В программе форкается пул
серверов (чтобы быстрее отрабатывать соединения мне не критично число
подключений в секунду, мне критично, чтобы они корректно
отсоединялись), которые висят на определенном порут и валят туда
методом tail -f socket_demo.log данные, добавляемые в сокет:
#!/usr/bin/perl -w
use File::Tail;
use IO::Socket;
use Symbol;
use POSIX;
$l = 'socket_demo.log';
$PORT=1234;
$server = IO::Socket::INET->new( Proto => 'tcp',
LocalPort => $PORT, Listen => SOMAXCONN,
Type => SOCK_STREAM, Reuse => 1) or die " making socket: $@";
$PREFORK =5;
$MAX_CLIENTS_PER_CHILD = 5;
%children=();
$children=0;
make_new_child() for(1 .. $PREFORK);
$SIG{CHLD}=\&REAPER;
$SIG{INT}=\&HUNTSMAN;
while(1){
sleep;
for($i=$children; $i<$PREFORK; $i++){make_new_child()}
}
sub tail_socket{
return $fi = File::Tail->new(
name => $l,
maxinterval => 0.1,
adjustafter => 1000000000,
interval => 4,
tail => 0)
}
sub make_new_child{
my $pid;
my $sigset;
$sigset=POSIX::SigSet->new(SIGINT);
sigprocmask(SIG_BLOCK, $sigset) or die "can't block SIGINT for fork: $!\n";
die "fork: $!" unless defined($pid = fork);
if($pid){
sigprocmask(SIG_UNBLOCK, $sigset) or die "can't unblock SIGINT for fork: $!\n";
$children{$pid}=1;
$children++;
return;
} else {
$SIG{INT} = 'DEFAULT';
$SIG{CHLD}='IGNORE';
sigprocmask(SIG_UNBLOCK, $sigset) or die "can't unblock SIGINT for fork: $!\n";
for($i=0; $i<$MAX_CLIENTS_PER_CHILD; $i++){
$client = $server->accept() or last;
&tail_socket();
while(1){
print $client $_ while($_=$fi->read);
}
} exit;
}
}
sub HUNTSMAN{
local($SIG{CHLD})='IGNORE';
kill 'INT' => keys %children;
exit;
}
sub REAPER{
$SIG{CHLD}=\&REAPER;
my $pid = wait;
$children--;
delete $children{$pid};
}
Но самая жопа это клиент, который обязан уметь сидеть за GPRS
соединением и уметь отлавливать падение вышеприведенного
сервера+отключение роутинга+физическое падение машины, на которой
вышеприведенный сервер работает+отслеживать ping timeout и при всем
при этом уметь уходить в автодозвон до сервера в перечисленных случаях
разрыва связи. Единственное что я не понял как сделать нормально, это
как определять, когда pppd отключает таблицу роутинга.
И еще ведь там как все происходит, канал на сотовом телефоне отвалился
и висит, никто ничего не знает, просто нет связи и все. Восстановить
связь можно только ручками. Вот этот драный клиент и запускает
перелогин для телефона (если не произошло изменения таблицы роутинга
и просто не пингуется)...
p.s. я не знаю, сколько мне лет надо писать на сях, чтобы написать такой
сервак на сях и тем более этот зубодробительный клиент отслеживающий виды
разъединения связи (в сущности все сводиться там к отслеживанию
таймаута по пингу, а как route -n проверять - я не понял,
потому он иногда виснет просто)...
еслиб не форкаться, то в отслеживающем соединение клиенте стояли бы подряд два цикла while(1){ping} и while(<$client>){read from socket}, а так они разнесены по процессам... и зависание пинга в while(1) по $SIG{ALARM} отслеживать надо.
как это линейно делать - не ясно... а тут форкнулся, отлавливай $SIG{HUP} ( не умею до конца правильно отлавливать, умею чтобы зомби не было) - и программа упростилась в 10-20 раз...
дык проги должны ходить под виндой, линухом, т.е. быть кроссплатформенными. яб сказал qx[route -n] каждую секунду, и был бы счастлив. я не из спортивного интереса так все делаю.
малшык хотел сказать что это даже не одна строка, а одно слово, правда малшык? подсказываю, а то боюсь от натуги разорвет. "DISTINCT".
но ведь этот тред не про то что SQL исполнилось много-много лет, правда? учимся читать. потом учимся читать вдумчиво. потом может наступить момент когда большие дяди перестанут посылать тебя ;)
Returns a list consisting of all the keys of the named hash. (In a scalar context, returns the number of keys.) The keys are returned in an _apparently__random__order_. The actual random order is subject to change in future versions of perl, but it is guaranteed to be the same order as either the values() or each() function produces
ты путаешь массивы с хешами. оба типа в perl базовые, часто ведут себя одинаково в скалярном и списковом контексте, но есть и принципиальные отличия. массив (@array) - это то к чему все привыкли в С и Pascal. значение можешь получить и модифицировать по индексу. у массивов этого типа значения хранятся в предсказуемом порядке. хеш (%hash) - это ассоциативный массив, в котором элемент доступен по ключу. порядок хранения пары ключ/значение не определен. если тебе понятнее аналогия с миром железа, то поищи различие между памятью с прямым доступом и ассоциативной. аналогия мне кажется уместной, хотя и не вполне корректной.
эти два типа массивов не комплементарны, но все же хорошо дополняют друг друга. возможно в perl6 появятся еще и хеш-массивы, которые будут иметь некоторые черты и того и другого типов.
Всем хорош перл. Только после него невозможно на другом языке программировать. Недавно понадобилось контрольную работу на Visual Basic - 300 раз оплевался.
А вот в этой фразе и содержится самая главная зараза, которая
окончательно погубила (местами неплохой) perl. На самом деле, есть
только Один Путь! И конце окажется только Один ;)