Создание серверных приложений на языке PERL


Вывод хеша в порядке вставки без использования Tie::IxHash


Без модуля Tie::IxHash вывод хеша в порядке вставки можно сделать при помощи дописывания числовой информации в хеш. Есть файл news.dat, который выводится скриптом в таком порядке, в каком данные занесены в файл. Необходимо удалить одновременно больше одной строчки из текста(не важно строка это, или разделитесь, это однозначно определяется переменной $/).

#!/usr/bin/perl -wT

use CGI 'param';

@del=param;

sub del{

pop @del; $mass=~s!"|&(.*?);!!g;

open F, "<news.dat" or die "Err: $!"; @mass=<F>; close F;

open F, ">news.dat";

foreach $un(@mass){ $as=$un; $i++; chomp $as;

$un=~s|(.*)new>(.*?)</a>(.*)\[(.*?)\]|$2$4|i;

$un=~s!"|&(.*?);!!g; chomp $un;

$u{"$un"}="$as#$i#\n";

}

foreach $del(@del){

$del=~s!"|&(.*?);!!g; chomp $del;

$terr="Link $u{$del} was deleted<p>\n" if (exists $u{"$del"});

$terr=~s!\d{8}|#(.*?)#!!ig;

print $terr; $terr="";

delete $u{$del} if (exists $u{"$del"});

}{ local $_;

while (($km, $_) = each %u){ push @tmp, "$u{$km}"}

}

@temp=grep{s/#(\d+?)#//}

map{ $_ -> [1]}

sort{$a->[0] <=> $b->[0]}

map{[/#(\d+?)#/, $_]}

grep{!$_{$_}++} @tmp;

print F reverse @temp;

close F;

}

Разъясним принцип работы скрипта. Исходная задача такова: на входе есть несколько checkbox из формы, в которых может быть поставлено больше одной галочки. Требуется найти и вычеркнуть отмеченные строчки. Файл news.dat модержит строки вида:

12345678<a href="lalalal">tra-ta-ta</a>&nbsp;&nbsp;&nbsp;[AAA]

чекбокс отмечается текстом tra-ta-ta, т.е. что-то вида

for ($i=$pos; $i<$pos+$n; $i++) {

$res[$i]=~s|^(\d\d\d\d)(\d\d)(\d\d)|$3\.$2\.$1 |;

print qq~<tr><td>$res[$i]</td><td>

<input type=checkbox name="$1$3" value="$1$3"></td></tr>~

if($res[$i]=~m!>(.*?)</a>(.*?)\[(.*?)\]!);

}

т.е. name="$1$3" value="$1$3" => name=tra-ta-ta&value=tra-ta-ta. Идея заключается в том, что элементы хеша можно пронумеровать в исходном порядке вставки, который будет исходным в силу того, что хеш определяется foreach, который последовательно читает данные из массива. поэтому говорим $i++; в цикле, ставим цифру в разделителе #\d+# и получаем на выходе хеш:




Начало  Назад  Вперед