REFERATUA.ORG.UA — База українських рефератів




даних, як плаский ASCIІ-файл і аналізуємо це полінійно, використовуючи зручну Perl-конструкцію while()<>.

!!!!!

Цей приклад вимагав Perl 5.001 або вище, через використання звертань, які не включалися в Perl 4 (або раніше). Perl 5 містить багато покращень та нових можливостей і є необхідним для будь-якого Перломану -доступний на http://www.perl.com/perl/CPAN/<>

# Спершу, відкрийте базу даних. (тут 'database.txt'.)
open (DAT, "database.txt") || die "Can't open the database: $! !.n";
$maxn = 0; # лічильник записів.
while () {
chop;
@field = split(/:/); # розбити запис на окремі поля
$n = $field[0]; # Перше поле є ID номером
$add[$n]{'name'} = $field[1]; # Потім ім'я
$add[$n]{'phone'} = $field[2]; # тел. номер
$add[$n]{'street'} = $field[3]; # адреса
$add[$n]{'city'} = $field[4]; # місто
$add[$n]{'state'} = $field[5]; # країна
$add[$n]{'zip'} = $field[6]; # поштовий індекс
}
$maxn = $n # Встановлено max номер до останнього запису

Тепер, коли база даних була завантажена, нам потрібно порівняти запит користувача з даними :

@results = (); # обнулити вихідний масив.

if ($name = $FORM{'name'}) { # пошук за ім'ям,
for ($I = 0; $I <= $maxn; $I++) { # пройти по всіх записах
if ($name eq $add[$I]{'name'}) { # шукаючи співпадань.
push(@results,$I); # якщо найдено, додати номер }
if (!@results) { &exitnone; } # якщо нічого не знайдено - вийти.
}
# Тепер для кожного критерію. Якщо є результати від попереднього
# пошуку, шукати в них, і видалити будь-які невідповідні записи.

if (($phone = $FORM{'phone'}) && !@results) {
for ($I = 0; $I <= $maxn; $I++) {
if ($phone eq $add[$I]{'phone'}) {
push(@results,$I);
}
}
if (!@results) { &exitnone; }
} elsif ($phone = $FORM{'phone'}) {
@r2 = @results;
foreach $I (@r2) {
if ($phone ne $add[$I]{'phone'}) {
@results = grep(!/$I/,@results);
}
}
if (!@results) { &exitnone; }
}

if (($street = $FORM{'street'}0 && !@results) {
for ($I = 0; $I <= $maxn; $I++) {
if ($street eq $add[$I]{'street'}) {
push(@results,$I);
}
}
if (!@results) { &exitnone; }
} elsif ($street = $FORM{'street'}) {
@r2 = @results;
foreach $I (@r2) {
if ($street ne $add[$I]{'street'}) {
@results = grep(!/$I/,@results);
}
}
if (!@results) { &exitnone; }
}

if (($city = $FORM{'city'}) && !@results) {
for ($I = 0; $I <= $maxn; $I++) {
if ($city eq $add[$I]{'city'}) {
push(@results,$I);
}
}
if (!@results) { &exitnone; }
} elsif ($city = $FORM{'city'}) {
@r2 = @results;
foreach $I (@r2) {
if ($city ne $add[$I]{'city'}) {
@results = grep(!/$I/,@results);
}
}
if (!@results) { &exitnone; }
}

if (($state = $FORM{'state'}) && !@results) {
for ($I = 0; $I <= $maxn; $I++) {
if ($state eq $add[$I]{'state'}) {
push(@results,$I);
}
}
if (!@results) { &exitnone; }
} elsif ($state = $FORM{'state'}) {
@r2 = @results;
foreach $I (@r2) {
if ($state ne $add[$I]{'state'}) {
@results = grep(!/$I/,@results);
}
}
if (!@results) { &exitnone; }
}

if (($zip = $FORM{'zip'}) && !@results) {
for ($I = 0; $I <= $maxn; $I++) {
if ($zip eq $add[$I]{'zip'}) {
push(@results,$I);
}
}
if (!@results) { &exitnone; }
} elsif ($zip = $FORM{'zip'}) {
@r2 = @results;
foreach $I (@r2) {
if ($zip ne $add[$I]{'zip'}) {
@results = grep(!/$I/,@results);
}
}
if (!@results) { &exitnone; }
}

У цей момент, або ми маємо успішні співпадання, які зберігаються в масиві @results, або ми не маємо співпаданнь, і в цьому випадку ми викликаємо підпрограму &exitnone. Тепер ми можемо видати клієнту результати (або їх відсутність).

# якщо немає результатівБ видати повідомлення та вийти.

sub exitnone {
print <No matches


There were no matches that fit your criteria.


Go back to the form to try again.

EOE

die;
}

# роздрукувати результати.

print <Search Results

The entries that matched your search



EOP

foreach $r (@results) {
print <
----
Name: $add[$r]{'name'}
Phone: $add[$r]{'phone'}
Address:
$add[$r]{'street'}
$add[$r]{'city'}, $add[$r]{'state'} $add[$r]{'zip'}

EOG

}
print <


Thank you for using my address book.
Go back to the form to make another search.

EOH

Тепер ми маємо робочий інтерфейс до адресної книги. Є декілька оптимізацій, які могли б бути зроблені, але це помітно лише для декількох дюжин записів. Зверніть увагу, що цей скрипт робить тільки логічний пошук AND на всіх полях. Можливо зробити OR-пошук - через знищення всіх викликів до &exitnone, крім останнього. Таким чином, коли програма не знаходить ніяких співпадань, вона не скінчиться, а перейде до наступного поля. Можна, також дати кінцевому користувачеві можливість вибрати, чи зробити пошук AND або OR за допомогою додавання спадного меню до сторінки форми. Тоді CGI міг би вийти або ні залежно від вибору.

Тепер, коли користувач може шукати у вашій БД за будь-яким критерієм, наступним логічним питанням є те, як додати або перемістити інформацію до бази даних. Ви могли, звичайно, б зробити це вручну, але було б добре дозволити пряме маніпулювання базою даних з Web безпосередньо. Приємно, що це не важко.

У маніпулюванні базою даних безпосередньо різниця між розмежованою і базою даних з записами фіксованої довжини стає важливою. З розмежованим текстом, ви не маєте легкого шляху для визначення місця, де один запис закінчується та інший починається. Таким чином, щоб змінити або викреслити один запис, необхідно переписати всю базу даних. Так в малих базах даних, це не є дійсно великою проблемою, але якщо ваша база даних є великою достатньо, для того, щоб це стало проблемою, можливо буде хорошою ідеєю проглянути використання сервера бази даних.

З базами даних з незмінної довжиною поля, однак, не необхідно переписати повну базу даних, щоб змінити запис. Через те, що довжина кожного запису відома, функції подібні до seek() і tell() (або їхній еквівалент у вашій улюбленій мові)


 
Загрузка...