Рад приветствовать вас на моем сайте!!!Сайт создан 4.03.03!!!На сайте содержится коллекция быстро пополняемого софта!!!Истории,картинки,анекдоты,приколы,статьи а также раздел Counter-Strike!!! .:: ForWard.net.ru ::.
 Рефераты 

Разделы сайта:

Главная

Софт

Counter-Strike

С.П.А.Х.Б.Халява

Обо мне

Ссылки

Услуги

Flash

Новости

Баннерообмен

Online-Tools

Связь:

Гостевая

Написать мне


Perl:


Простейший счетчик на Perl

Простейший, но и очень популярный скрипт: текстовый счетчик. В этой статье мы разберем его работу построчно.

Для начала взглянем на код:

#!/usr/local/bin/perl

open(COUNTER,"<counter.txt");
$counter=<COUNTER>;
close(COUNTER);

$counter++;

open(COUNTER,">counter.txt");
print COUNTER $counter;
close(COUNTER);

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

#!/usr/local/bin/perl
указывает путь к Perl'y. Этот путь можно узнать, введя в Linux команду which perl

open(COUNTER,"<counter.txt");
открывает файл с именем counter.txt в текущей директории для чтения (знак "<")

$counter=;
в переменную $counter читается содержимое открытого файла - в данном случае лишь одно число.

close(COUNTER);
закрывает открытый файл

$counter++;
прибавляет единицу к значению переменной

open(COUNTER,">counter.txt");
открывает файл для записи (write) (знак ">"). При этом старое слдержимое файла стирается. Если нужно записать информацию в конец файла, используйте ">>"

print COUNTER $counter;
записывает в файл новое значение переменной

close(COUNTER);
закрывает открытый для записи файл

print "Content-type: text/html\n\n";
эта строчка должна обязательно возвращаться CGI-скриптом в первую очередь, так как указывает, к какой тип данных выдает скрипт. Обычто это text/html или text/plain (просто текст), но может быть и, например, image/gif.

print "$counter";
выводит значение счетчика

Теперь для работы счетчика необходимо файл counter.cgi поместить в cgi-bin вашего сервера, задав ему атрибуты 755 (chmod 755 counter.cgi), и в ту же директорию поместить counter.txt, задав ему атрибуты 777 (chmod 777 counter.txt) и записав туда начальное значение счетчика.

Протестировать работу счетчика можно, загрузив его из браузера: servername.com/cgi-bin/counter.cgi. Если все сделано правильно, то значение будет увеличиваться на 1 при каждой перезагрузке страницы.

И, наконец, чтобы вставить это значение в страницу, можно воспользоваться SSI:
<!--#exec cgi="/cgi-bin/counter.cgi" -->. При этом скрипт будет также выполняться, при каждом запуске увеличивая число посещений на 1.

Perl в быту

Если вы используете Perl, то, скорее всего, у вас стоит интерпретатор Perl - программа, позволяющая запускать скрипты, написанные на Perl на простой рабочей станции (я использую ActivePerl от ActiveState - activestate.com).

Конечно, первоочередная функция интерпретатора - отладка скриптов и поиск ошибок. Но гибкость Perl пожно использовать и в быту. Рассмотрим несколько примеров:

ПРИМЕР 1.

У вас стоит программа, позволяющая докачивать файлы при разрыве соединения (например, ReGet, GoZilla или GetRight), и вам нужно скачать 500 файлов с именами от file1.zip до file500.zip. Вместо того, чтобы вручную добавлять каждый URL или кликать по ссылкам, можно воспользоваться возможностью "качалок" открывать списки файлов для скачивания.

Для примера возьмем GetRight. Формат списка (*.grx) для нее выглядит так:

URL: http://www.server.com/dir/file1.zip
File: C:\My Downloaded Files\file1.zip

URL: http://www.server.com/dir/file2.zip
File: C:\My Downloaded Files\file2.zip
...
Как видно, для каждого файла указывается его URL, то есть адрес, откуда его нужно качать, и путь, куда его следует сохранить. Сразу приведу исходник генератора списка файлов:
# Открываем файл списка
open(GRX,">list.grx");

# Цикл для 500 файлов
for ($i=1;$i<=500;$i++)
{
  # Пишем адрес исходного файла
  print GRX "URL: http://www.server.com/dir/file$i.zip\n";

  # Пишем адрес файла на локальной машине
  print GRX "File: C:\My Downloaded Files\file$i.zip\n\n";
}
# Закрываем файл
close GRX;
В результате получаем список из 500 файлов. Все что надо - открыть его в GetRight (File->Import Download List).

Единственный подводный камень, что может вас подстерегать - числа не в порядке 1,2,3,..11,12,13,..500, а в виде 001,002,003,...011,012,013,..500. Хотя эту проблему решить легко:

  # Вставить этот код в тело цикла

  # Просто вводим новую переменную
  $j=$i;

  # для числа меньше 10 добавим в начале два ноля
  if($i<10)
  {
    $j="00$i";
  }

  # для числа от 10 до 99 добавим в начале один ноль
  if((10<=$i)&&($i<100))
  {
    $j="0$i";
  }

  # дальше идет запись в файл как в первом примере,
  # но с использованием $j вместо $i
Таким образом, вы можете сгенерировать любой список, даже для файлов в нескольких пронумерованных каталогах и т.д. Здорово облегчает жизнь, а, главное, код недолго писать.

ПРИМЕР 2.

Допустим, опять тот же GetRight. В нем есть опция, при включении которой программа сохраняет все свои действия (добавление нового файла на скачку, продолжение скачивания, остановка скачивания, завершение скачивания и т.д.) в файл (ведение лога). Лично мне он нужен для того, чтобы не забыть полезные URL'ы (не буду же я сам их записывать), откуда я качал файлы. Log выглядит примерно так:

...
2001/06/12-19:31:36:  File: D:\music\file1.mp3 = ftp://ftp.server1.com/pub/file1.mp3
2001/06/12-19:32:19:  File: D:\music\file2.mp3 = ftp://ftp.server1.com/pub/file2.mp3
2001/06/12-19:37:11:  (Re)Started download: ftp://ftp.server1.com/pub/file1.mp3
2001/06/12-19:38:05:  (Re)Started download: ftp://ftp.server1.com/pub/file2.mp3
2001/06/13-22:11:37:  (Re)Started download: ftp://ftp.server1.com/pub/file2.mp3
2001/06/13-22:11:38:  (Re)Started download: ftp://ftp.server1.com/pub/file1.mp3
2001/06/13-23:57:24:  Finished downloading: ftp://ftp.server1.com/pub/file1.mp3
2001/06/14-18:31:49:  (Re)Started download: ftp://ftp.server1.com/pub/file2.mp3
2001/06/13-21:59:24:  Finished downloading: ftp://ftp.server1.com/pub/file2.mp3
...
При моей задаче (не забыть) меня интересуют только строки File:, откуда я точно знаю что, когда, и куда сохранил. Остальные строки в моем случае только раздувают файл и мешают поиску, следовательно их надо удалить. И Perl с его Regular Expressions прекрасно для этого сгодится.
Вот простой скрипт:
# Открываем лог для чтения и построчни читаем его в массив
open(LOG,";
close LOG;

# Пока массив не кончится,
$i=0;
while ($i<=$#log)
{
  if($log[$i]!~/  File:/)
  {
    # Если строчка не содержит File:, удалить ее
    splice(@log,$i,1);
  }
  else
  {
    # Иначе пропустить
    $i++;
  }
}

# И перезаписать лог
open(LOG,">download log.log");
foreach $line (@log)
{
  print LOG "$line";
}
close LOG;
В итоге в файле download log.log останутся только строки, содержащие File:, а весь "мусор" удалится.

Вот и все. Надеюсь, я подкинул вам несколько идей. Ведь на самом деле Perl подно приспособить практически везде. В его задачи кроме создания однородных списков и чистки логов может входить сортировка, статистика, поиск и замена информации и многое другое.

Функции Perl

Функции для работы со скалярными переменными и строками
  chomp, chop, chr, crypt, hex, index, lc, lcfirst, length, oct, ord, pack, q/STRING/, qq/STRING/, reverse, rindex, sprintf, substr, tr///, uc, ucfirst, y///

Регулярные выражения и соответствие маске
  m//, pos, quotemeta, s///, split, study, qr//

Числовые функции
  abs, atan2, cos, exp, hex, int, log, oct, rand, sin, sqrt, srand

Функции для работы с массивами
  pop, push, shift, splice, unshift

Функции для работы со списками (lists)
  grep, join, map, qw/STRING/, reverse, sort, unpack

Функции для работы с ассоциативными массивами (хэшами)
  delete, each, exists, keys, values

Функции ввода/вывода
  binmode, close, closedir, dbmclose, dbmopen, die, eof, fileno, flock, format, getc, print, printf, read, readdir, rewinddir, seek, seekdir, select, syscall, sysread, sysseek, syswrite, tell, telldir, truncate, warn, write

Functions for fixed length data or records
  pack, read, syscall, sysread, syswrite, unpack, vec

Функции для управления файлами и каталогами
  -X, chdir, chmod, chown, chroot, fcntl, glob, link, lstat, mkdir, open, opendir, readlink, rename, rmdir, stat, symlink, umask, unlink, utime

Keywords related to the control flow of your perl program
  caller, continue, die, do, dump, eval, exit, goto, last, next, redo, return, sub, wantarray

Функции, относящиеся к времени
  gmtime, localtime, time, times

Keywords related to scoping
  caller, import, local, my, package, use

Разные функции
  defined, dump, eval, formline, local, my, reset, scalar, undef, wantarray

Функции для работы с процессами и группами процессов
  alarm, exec, fork, getpgrp, getppid, getpriority, kill, pipe, qx/STRING/, setpgrp, setpriority, sleep, system, times, wait, waitpid

Функции для работы с модулями Perl
  do, import, no, package, require, use

Функции, относящиеся к классам и объектно-ориентированному программированию
  bless, dbmclose, dbmopen, package, ref, tie, tied, untie, use

Low-level socket functions
  accept, bind, connect, getpeername, getsockname, getsockopt, listen, recv, send, setsockopt, shutdown, socket, socketpair

System V interprocess communication functions
  msgctl, msgget, msgrcv, msgsnd, semctl, semget, semop, shmctl, shmget, shmread, shmwrite

Получение информации о пользователе и группе
  endgrent, endhostent, endnetent, endpwent, getgrent, getgrgid, getgrnam, getlogin, getpwent, getpwnam, getpwuid, setgrent, setpwent

Получение информации о сети
  endprotoent, endservent, gethostbyaddr, gethostbyname, gethostent, getnetbyaddr, getnetbyname, getnetent, getprotobyname, getprotobynumber, getprotoent, getservbyname, getservbyport, getservent, sethostent, setnetent, setprotoent, setservent

















All rights reserved © Copyright 2003 Нефтеюганск. Дизайн и разработка - Гордий Григорий
Hosted by uCoz