Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РЭУБД_лекции.doc
Скачиваний:
3
Добавлен:
01.03.2025
Размер:
1.05 Mб
Скачать

Функция values

Функция values возвращает обычный массив, состоящий из значений ассоциативного массива. Она имеет следующий формат:

@value_list = values(%Array)

Функция values возвращает массив значений ассоциативного массива в виде регулярного списка. Следующий фрагмент программы иллюстрирует использование функции values:

# Используем значения из предыдущего примера

%ages = ('Bob', 25, 'Mary', 30, 'Zack', 15);

@list = sort values %ages; # @list (15, 25, 30)

@list = %ages; # @list ('Zack', 15, 'Bob', 25, 'Mary', 30)

Функция each

Функция each осуществляет итерации элементов в ассоциативном массиве. Она имеет следующий формат:

@key_values = each(%Array);

Всякий раз, когда скрипт вызывает функцию each, она возвращает список из двух компонент, которые содержат пару ключ-значение. Когда функция достигает конца списка, она возвращает пустой список. При следующем вызове функции процесс итерации начнется сначала. Следующий фрагмент программы иллюстрирует использование функции each:

# Используем значения из предыдущего примера

%ages = ('Bob', 25, 'Mary', 30, 'Zack', 15);

While (($name, $age) = each %ages)

{

# Выведем ages

Print "$key is $ages{$key}\n";

}

Функция delete

Функция delete удаляет элементы ассоциативного массива. Она имеет следующий формат:

Delete $Array{Key}

Следующая инструкция использует функцию delete для того, чтобы удалить элемент, отвечающий ключу Bob из ассоциативного массива $Employees:

Delete $Employees{'Bob'}

Пример скриптов для выполнения практического задания

1. Добавление информации в базу (на примере винного погреба -добавление страны)

Часть 1

#!d:/actiperl/bin/perl.exe

# add new country to database - 1-st stage -- check existing countries

use DBI;

# declarations

my $dbh ; #database handler

my $sth ; #database statement handler

my @countries = (); #declared countries

my $base = 'wineyard'; #database name

my $comp = 'localhost'; #IP-address of host computer

my $dbport = '3306'; #standard MySQL port

my ($ky, $val);

print "Content-type: text/html\n\n";

print <<EOH;

<HTML>

<HEAD>

<META NAME="Author" CONTENT="Alexandre Lazarev">

<style type="text/css">

.norm {padding-left: 20; padding-right: 10; padding-top: 10; }

a {text-decoration: none; }

</style>

<TITLE>Wineyard DB_connection</TITLE>

</HEAD>

<BODY BGCOLOR="#F0F0F0" TEXT="#000000" LINK="#0000EE" VLINK="#CC0080" ALINK="#CC66CC">

<h1 align="center"><font color="#0602B0" size="+4">Wineyard</font></h1>

<p class="norm" align="center"><font size="+1">Интерфейс к базе данных по винам

на основе <b>MySQL</b></font></p>

<hr align="center" noshade size="2" width="90%">

EOH

# process database index files

$dbh = DBI->connect("DBI:mysql:database=$base;host=$comp;port=$dbport", '', '');

if (not $dbh) {

print <<ERRDB;

<p class="norm">Не удалось открыть связь с базой <b>$base</b> по порту $dbport.<br>

Причина ошибки – <b>$DBI::errstr</b></p>

<hr align="center" noshade size="2" width="90%">

<p class="norm" align="left"><font size="+1"><a href="/wineyard/index.html">Вернуться

к главной странице</a></font></p>

</body></html>

ERRDB

exit;

};

$sth = $dbh->prepare('select ctry, id from country where id > 0 order by ctry');

$sth->execute;

while(($ky, $val)=$sth->fetchrow_array) { #country list will be ordered

push(@countries, $ky);

};

$sth->finish;

print <<SOF;

<p class="norm" align="center"><font color=navy size="+1">В настоящее время в базе

зарегистрированы следующие страны:</font></p>

<table cellpadding="5" align="center">

SOF

#creating neat table

$lines = int(scalar(@countries)/5); # 5-column table

if ((scalar(@countries) % 5) != 0) {

$lines++;

};

for ($i=0; $i < $lines; $i++) {

print "<tr>";

foreach $j (0..4) {

print "<td width=10>$countries[$i+$j*$lines]</td>";

};

print "</tr>";

};

# table isn't closed yet

print <<EOFR;

</table>

<hr align="center" noshade size="2" width="90%">

<form name="add_cn" action="apache/Apache/cgi-bin/addcnt.pl" method="post">

<p class="norm">

<table align="center" cellpadding="5"><tr><td>

Введите новую страну:</td><td><input type="text" size="20" name="ncnt"</td></tr>

<tr><td> </td><td> </td></tr>

<tr><td width="10%"><input type="submit" value="Занести в базу"></td>

<td width="10%"><input type="reset" value="Очистить поле"></td></tr>

</table>

</p>

</form>

<hr align="center" noshade size="2" width="90%">

<p class="norm" align="left"><font size="+1"><a href="/wineyard/index.html">Вернуться

к главной странице</a></font></p>

<hr align="center" noshade size="2" width="90%">

</BODY>

</HTML>

EOFR

exit;

Часть2

#!d:/actiperl/bin/perl.exe

# add new country to database - 2-nd stage -- updating countries data

use DBI;

use CGI qw(:standard);

# declarations

my $dbh ; #database handler

my $sth ; #database statement handler

my $base = 'wineyard'; #database name

my $comp = 'localhost'; #IP-address of host computer

my $dbport = '3306'; #standard MySQL port

my ($ky, $val);

my @countries = ();

print "Content-type: text/html\n\n";

print <<EOH;

<HTML>

<HEAD>

<META NAME="Author" CONTENT="Alexandre Lazarev">

<style type="text/css">

.norm {padding-left: 20; padding-right: 10; padding-top: 10; }

a {text-decoration: none; }

</style>

<TITLE>Wineyard DB_connection</TITLE>

</HEAD>

<BODY BGCOLOR="#F0F0F0" TEXT="#000000" LINK="#0000EE" VLINK="#CC0080" ALINK="#CC66CC">

<h1 align="center"><font color="#0602B0" size="+4">Wineyard</font></h1>

<p class="norm" align="center"><font size="+1">Интерфейс к базе данных по винам

на основе <b>MySQL</b></font></p>

<hr align="center" noshade size="2" width="90%">

EOH

# process database index files

$dbh = DBI->connect("DBI:mysql:database=$base;host=$comp;port=$dbport", '', '');

if (not $dbh) {

print <<ERRDB;

<p class="norm">Не удалось открыть связь с базой <b>$base</b> по порту $dbport.<br>

Причина ошибки – <b>$DBI::errstr</b></p>

<hr align="center" noshade size="2" width="90%">

<p class="norm" align="left"><font size="+1"><a href="/wineyard/index.html">Вернуться

к главной странице</a></font></p>

</body></html>

ERRDB

exit;

};

# here database is connected

# process input parameters

$ncnt = param('ncnt');

if ($ncnt eq "") { # a very looong block of input error processing

print <<EOR;

<p class="norm" align="left"><b>Не указано наименование страны-производитедя</b> – обязательное поле</p>

<hr align="center" noshade size="2" width="90%">

EOR

$sth = $dbh->prepare('select ctry, id from country where id > 0 order by ctry');

$sth->execute;

while(($ky, $val)=$sth->fetchrow_array) { #country list will be ordered

push(@countries, $ky);

};

$sth->finish;

$dbh->disconnect;

print <<SOF;

<p class="norm" align="center"><font color=navy size="+1">В настоящее время в базе

зарегистрированы следующие страны:</font></p>

<table cellpadding="5" align="center">

SOF

#creating neat table

$lines = int(scalar(@countries)/5); # 5-column table

if ((scalar(@countries) % 5) != 0) {

$lines++;

};

for ($i=0; $i < $lines; $i++) {

print "<tr>";

foreach $j (0..4) {

print "<td width=10>$countries[$i+$j*$lines]</td>";

};

print "</tr>";

};

# table isn't closed yet

print <<EOFR;

</table>

<hr align="center" noshade size="2" width="90%">

<form action="apache/Apache/cgi-bin/addcnt.pl" method="post">

<p class="norm">

<table align="center" cellpadding="5"><tr><td>

Введите новую страну:</td><td><input type="text" size="20" name="ncnt"</td></tr>

<tr><td> </td><td> </td></tr>

<tr><td width="10%"><input type="submit" value="Занести в базу"></td>

<td width="10%"><input type="reset" value="Восстановить поле"></td></tr>

</table>

</p>

</form>

<hr align="center" noshade size="2" width="90%">

<p class="norm" align="left"><font size="+1"><a href="/wineyard/index.html">Вернуться

к главной странице</a></font></p>

<hr align="center" noshade size="2" width="90%">

</BODY>

</HTML>

EOFR

exit; # when country wasn't entered

};

#everything is Ok with parameters

# create record in country table

$qry = "INSERT INTO country (id, ctry) VALUES (NULL, "

. $dbh->quote($ncnt) . ")";

$rows = $dbh->do($qry);

$dbh->do('FLUSH TABLES, STATUS');

$dbh->disconnect;

if ($rows < 1) {

print qq[<p class="norm">Ошибка базы данных – страна <b>$ncnt</b> не внесена в базу данных];

print "<br>Причина ошибки – <b>$DBI::errstr</b></p>\n";

} else {

print qq[<p class="norm" align="left">Новая запись внесена в таблицу стран: ];

print "<font color=navy><b>$ncnt</b></font></p>";

};

print <<EODT;

<hr align="center" noshade size="2" width="90%">

<p class="norm" align="left"><font size="+1"><a href="/cgi-bin/addcn.pl">Добавить еще

одну запись в базу</a></font></p>

<p class="norm" align="left"><font size="+1"><a href="/wineyard/index.html">Вернуться

к главной странице</a></font></p>

<hr align="center" noshade size="2" width="90%">

</BODY>

</HTML>

EODT

exit;