Шпионская программа
Допустим в Пентагоне нужно ввести авторизованный доступ к данным по определенным правилам:
есть полный файл(data.crypt) всех записей вида(расшифрованный)
London#явка1#доступ#прочее#логин1
Damask#явка2#доступ#прочее#логин2
Peru#явка3#доступ#прочее#логин3
И есть файл скажем для агента agent007.crypt, в котором описан вид доступа только
к определенным данным:
логин1
логин3
т.е. из файла data.crypt нужно выбрать совпадения строк с подстроками файла agent007.crypt и выбрать из data.crypt все параметры спецзадания(-ий). Результат нужно вывести в виде:
<A NAME=\"a\">
aasd
abf
Absc
afgh
<A NAME=\"b\">
bcd
bgh
bfe
и т.д.
т.е. в отсортированном виде. Шпионы тоже люди.
Скрипт ниже решает данную задачу при помощи операций с массивами и использованием хеша массивов(хотя наверное можно было сделать и проще, здесь же главное показать использование хеша массивов):
#!/usr/bin/perl -wT #ключ -T означает повышенную безопасность, Пентагон все-таки
use strict;
my(@data, @new, $line, $m, @res, @sort, $k, %ha);
my($autor, $pesniya, $position, $u, $n, $im);
open F, "<data.crypt" or die "Err: $!"; @data=<F>; close F;
open F, "<agent007.crypt" or die "Err: $!" @data=<F>; close F;
foreach $line(@new){
foreach $m (@data){push @res, "$m" if($m=~m/^(.*)#$line$/)}
}
@sort=map{$_ -> [1]}
sort{$a->[0] cmp $b->[0]}
map{[/^(.*)#/, $_]}
grep{!$_{$_}++} @res;
foreach $u('a' .. 'z'){
foreach $n(@sort){push @{$ha{$u}}, $n if($n=~m/^$u/)}
}
for $k(sort keys %ha){print "<a href=\"#$k\">$k</a> "}
print "\n<p><center>\n";
for $k(sort keys %ha){
print "<a name=\"$k\"></a><br>\n";
foreach $im(@{$ha{$k}}){
($autor, $pesniya, $position)=split /#/, $im;
print "$autor, $pesniya, $position<br>\n";
}
}
print "</center>";
Разберем работу программы:
foreach $line(@new){
foreach $m (@data){push @res, "$m" if($m=~m/^(.*)#$line$/)}
}
Отсеять из файла data.crypt разрешенные данные для agent007.crypt при помощи сравнения подстрок.
@sort=map{$_ -> [1]}
sort{$a->[0] cmp $b->[0]}
map{[/^(.*)#/, $_]}
grep{!$_{$_}++} @res;
Отсортировать данные для данного агента в алфавитном порядке по первой ячейке из общей таблицы data.crypt и убрать повторения одинаковых строк.
foreach $u('a' .. 'z'){
foreach $n(@sort){push @{$ha{$u}}, $n if($n=~m/^$u/)}
}
Создавть хеш массивов, где ключем будет буква, а значением будет массив из строк спецзаданий.
for $k(sort keys %ha){print "<a href=\"#$k\">$k</a> "}
Вывести линейку начальных букв, по которым будут сортироваться результаты.
for $k(sort keys %ha){
print "<a name=\"$k\"> </a><br>\n";
foreach $im(@{$ha{$k}}){
($autor, $pesniya, $position)=split /#/, $im;
print "$autor, $pesniya, $position<br>\n";
}
}
Вывести массивы, ассоциированные со значениями ключей букв. @{$ha{$k}} - просто обычный массив, доступ к которому зависит от значения ключа $k. Каждый элемент массива стостоит из строки с разделителями #, по нему и разделяет функция split ($autor, $pesniya, $position)=split /#/, $im;