PERL - статьи

Начало скрипта можно взять из


Рассмотрим пример открытия и чтения каталога и вывод списка файлов,содержащихся в нем. Начало скрипта можно взять из предыдущего примера.Предположим,что пользователь,зарегистрированный на веб-сервере,хочет войти в свой домашний каталог.
#!/usr/local/bin/perl #Объявляем глобальные переменные.
$request=$ENV{'REQUEST_METHOD'}; $content=$ENV{'CONTENT_LENGTH'}; $basedir="http://www.mydomain.com/~"; $file="login.txt"; $url="http://www.mydomain.com"; $dir="f:/home/"; $cgi="f:/usr/local/apache/cgi-bin";
#Подпрограммы для декодирования данных из формы.
sub urldecode { local($val)=@_; $val=~ s/\+/ /g; $val=~ s/%[0-9a-hA-H] {2}/pack('C',hex($1))/ge; return $val; }
sub strhtml { local($val)=@_; $val=~s//>/g; $val=~s/(http:\/\/\+S)/<A href="$1">$1<\/A>/g; return $val; } ######################################################################
if ($request eq 'GET') { $query=$ENV{'QUERY_STRING'}; } else { sysread(STDIN,$query,$content); }
#Генерируем форму,если никакие данные не введены. print "Content-type:text/html\n\n"; print <<HTML_gen; <HTML><BODY bgcolor="e6e8fa">
HTML_gen
if ($query eq '') { print "Content-type:text/html\n\n"; print <<HTML; <HTML><HEAD>
</HEAD><BODY bgcolor="e6e8fa">
<FORM ACTION="../cgi-bin/fileman.cgi" name="form1" METHOD="POST">
<h2 align=center><font color="ff0000">System login.</font></h2>


<p><center>Please,enter your login name and password: <p><TABLE BGCOLOR="cccccc">
<tr><td colspan=2 align=center bgcolor="99cccc"><b><font color="ff0000">
I am registered user</font></b>
<TR><TD><p><b>Login:</b><TD><INPUT TYPE="text" NAME="login" SIZE="20">
<TR><TD><p><b>Password:</b><TD><INPUT TYPE="password" NAME="pass" SIZE="20">


<tr><td colspan=2 align=center><input type=submit value="Submit"></center>
HTML } #Если информация получена,декодируем поля формы.
else { foreach (@fields=split(/&/,$query)) { if (/^login=(.*)/) { $login=&urldecode ($1); } if (/^pass=(.*)/) { $password=&urldecode ($1); } }
#Открываем базу данных и проверяем логин и пароль. open(INFO,$file) die; @data=; close(INFO);
foreach $string(@data) { @item=split(/&/,$string); foreach (@item) { if (($item[0] eq $login) && ($item[1] eq $password)) {
#Если все нормально,переходим в пользовательский каталог.
print "Content-type:text/html\n\n"; print <<HTML; <html><body bgcolor="e6e8fa">
#Приветствуем пользователя. <p><h2 align=center><font color="ff0000">Hello,$login!</font></h2>
<p><center> Welcome to your home directory! <p>Your URL is <a href="$basedir$login">$basedir$login.</a></center>
HTML
######################### # Directories list # #########################
$userdir=$dir.$login; chdir ("$userdir");
#Открываем каталог и читаем список файлов в массив. opendir(DIR,"$userdir") die "Cannot open $userdir!"; while (@files=readdir(DIR)) {
#Если каталог содержит подкаталоги,выводим их отдельно,а также не показываем #каталоги "." и ".." Печатаем шапку таблицы. print <<HTML; <p><center>
<table bgcolor=\"bfbfbf\" width=600 border cellspacing=0 cellpadding=0 nowrap>
<tr><td colspan=5 align=center nowrap><b><font color="ff0000">Directories</font></b></td></tr>
<tr><td>.</td><td align=center><b>List</b></td><td><b>Size</b><td><td><b>Last accessed</b></td><td><b>Last modified</b></td>
HTML foreach $file(@files) {


#Стстистика файлов-размер,время последнего обращения и модификации. $size=(stat("$userdir/$file"))[7]; $atime=localtime((stat("$userdir/$file"))[8]); $mtime=localtime((stat("$userdir/$file"))[9]);
#Печатаем список подкаталогов. if ( -d "$userdir/$file" && "$file" ne "." && "$file" ne "..") {
print "<tr><td width=30><img src=\"$url/image/folder.gif\"></td><td width=100 align=left>$file</td>\n"; print "<td width=50>",$size,"</td><td width=200>",$atime,"</td><td width=200>",$mtime,"</td></tr>\n"; } } print "</table>\n";
################ # Files list # ################
# Ту же операцию проводим для файлов.Печатаем шапку таблицы. print <<HTML; <p><table bgcolor=\"bfbfbf\" width=600 border cellspacing=0 cellpadding=0>
<tr><td colspan=5 align=center><b><font color="ff0000">Files</font></b></td></tr>
<tr><td>.</td><td><b>List</b><td><b>Size</b><td><b>Last accessed</b><td><b>Last modified</b></tr>
HTML
foreach $file(@files) { $size=(stat("$userdir/$file"))[7]; $atime=localtime((stat("$userdir/$file"))[8]); $mtime=localtime((stat("$userdir/$file"))[9]);
if (!-d "$userdir/$file" && "$file" ne "." && "$file" ne "..") { push (@dir,"$userdir/$file");#Помещаем найденные файлы в массив $number=@dir; #Подсчитываем их количество.
#Выдаем информацию. print "<tr><td width=30><img src=\"$url/image/page.gif\"></td><td width=100><a href=\"$basedir$login/$file\">",$file,"</a></td>\n"; print "<td width=50>",$size ,"</td>\n"; print "<td width=200>",$atime,"</td><td width=200>",$mtime,"</td></tr>\n"; } } print "</table>\n"; print "<p><center><b><font color=\"0000ff\">There are ",$number," files in this directory.</b></font></center>\n"; }
Надеюсь,я объяснил все достаточно подробно.Я выбрал намеренно сложные примеры,чтобы показать все операции,которые можно производить с файлами и каталогами.Файлы еще можно загружать на сервер через веб.Этому посвящен следующий раздел.

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