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

Шпионская программа


Допустим в Пентагоне нужно ввести авторизованный доступ к данным по определенным правилам:

есть полный файл(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;


Содержание раздела