PERL - статьи




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


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";

}

Дальше начинаем в хеше искать данные, которые передались через @del=param;

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"});

}

при помощи функции exists проводится проверка на наличие элемента в хеше. Итак, получили хеш с ключами, являющимися подстроками строк из файла news.dat, и значениями самих строк, т.е. в памяти точно лежит файл, превосходящий по размеру news.dat чуть меньше чем в два раза.

Далее идет вытаскивание значений из файла, уже без удаленных(было сравнение по подстроке):

{ local $_;

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

}

Замечательно, проверили, занесли в массив @tmp. Здесь локализация local $_; применена для того, чтобы убрать при использовании ключа -w лишнего warning из серверного лог-файла ошибок. Вытащили новый массив, который нужно соранить в файл news.dat. Теперь нужно убрать из массива @tmp повторяющиеся элементы, отсортировать по номерам #(\d+)#, убрать эти номера из элементов массива @tmp и сохранить массив в прежнем виде:

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

map{ $_ -> [1]}

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

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

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

print F reverse @temp;

операция grep{!$_{$_}++} удаляет из массива повторяющиеся элементы, map{[/#(\d+?)#/, $_]} создает временный список анонимных массивов, которые затем сортируются sort{$a->[0] <=> $b->[0]}, затем map{ $_ -> [1]} приводит элементы массива в удобоваримый вид и grep{s/#(\d+?)#//} вырезает нуумерацию массива, оставшуюся от начального формирования хеша %u.

Далее оборачиваем конечный массив @temp функцией reverse и получам такой-же файл news.dat, только без элементов, отмеченных пользователем в чекбоксе.

Еще один вывод хеша в порядке вставки без использования приспособленных

для этого модулей:

my @qq = qw(a s d f g h j y f d e e t y u i v f s a e);

my @del = qw(f h u);

my (%to, %del, %exist);

map {$del{$_} = 1} @del;

for (my $i=$#qq; $i>=0; $i--){

if (!exists $exist{$qq[$i]}){

$exist{$qq[$i]} = 1;

$to{$i} = $qq[$i] unless(exists $del{$qq[$i]});

}

}

my @tmp;

foreach (sort{$a$b} keys %to){

push @tmp, $to{$_};

print "$to{$_}\n";

}

автор: Monax from




Содержание  Назад  Вперед