Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Некоторые заметки по языку программирования perl \n\t


Служба Рассылок Subscribe.Ru

03.02.2002

Mason - онлайновый парсер статических файлов на perl

Программа, позволяющая полностью управлять статическим и, если того захотеть, динамическим наполнением сайта. Или писать вызовы обращений к базе данных прямо в тексте html-страницы.

Для её запуска необходимы Apache и mod_perl.

В httpd.conf нужно дописать то, о чем написано в man HTML::Mason. После этого Ваш сайт(вне зависимости от его размера) ну, если не становится ручным пони, то уж точно чем нибудь типа уральского тяжеловоза. Все описания и другие оставшиеся слова можно прочитать на сайте http://www.masonhq.com/. Несмотря на возмущенные вскрики различных личностей "а это можно прочитать в man, а у меня пальцы веером свело" опишу установку этого пакета под Linux. Сначала HTML-Mason, потом mod_perl, далее некоторая возня с service httpd restart на предмет "в httpd.conf нужно дописать то, о чем написано в man HTML::Mason, ну, примерно то, что нужно написать". Потом создать директорию /var/www/mason. После её создания пишем простой test.html:

   <HTML>
   <HEAD>
   <TITLE>Yo! Wazzup!!!!
   % my $noun = 'World';
   % my $date = qx[date];
   Hello <% $noun %>!
   Today is <% $date %>
   % my $ua = $r->header_in('User-Agent');
   % if ($ua =~ /msie/i) {
     Welcome, Internet Explorer users
   ...
   % } elsif ($ua =~ /mozilla/i) {
     Welcome, Netscape users
   ...
   % }
   </TITLE></HEAD>
   <BODY BGCOLOR="#FFFFFF">
   <H1>Yo! Wazzup!!!!</H1>
   <& index.file &>
   </BODY>
   </HTML>
строчка, в которой содержится сам код, должна начинаться с символа %:% my $noun = 'World'; Если не хочется кадый раз ставить символ процента, то код можно поставить в между тегами
<%perl>
 ... to do...
</%perl>
Аналогично директивам SSI из html странички можно вызывать и файлы(в том числе и текстовые, например если создается библиотека).
<& index.html &>
Можно так-же делать включения скриптов вида
%# <& /include/all_newsheads.msn &>
Хотя так-же спокойно можно включать скрипты командой qx[lalalala]

Например обращение к базе данных на серверной стороне:

    <html>
      <head><title><% $headline
%></title></head>
      <body>
      <h2><% $headline %></h2>
      By <% $author %>, <% $date %><p>

      <% $body %>

      </body></html>

      <%init>
      # Fetch article from database
      my $dbh = DBI::connect ...;
      my $sth = $dbh->prepare("select * from articles where id = ?");
      $sth->execute($article_id);
      my ($headline,$date,$author,$body) = $sth->fetchrow_array;
      # Massage the fields
      $headline = uc($headline);
      my ($year,$month,$day) = split('-',$date);
      $date = "$month/$day";
      </%init>

      <%args>
      $article_id
      </%args>
Фактически блок <%init> эквивалентен блоку <%perl>. При таком введении наиболее читаемые компоненты (особенно для непрограммистов) содержат HTML в одном непрерывном блоке наверху, с простыми заменами для динамических элементов, и никаких отвлекающих и запутывающих блоков кода на perl. В основном <%init> блок устанавливает переменные замены и такая организация кода на странице позволяет непрограммистам работать с HTML без того, чтобы отвлекаться или обескуражживаться кодом perl.

Примеры работы, http://www.pereplet.ru, литературный журнал, где каждое высказывание в дискуссии по определенному произведению прицепляется к определенному произведению html. И практически на одном mason'е написан научный сервер http://www.nature.ru .

03.02.2002

Backup прав доступа на файлы и директории[only for unix like systems]

Программа, восстанавливающая пермишны на файлы например в случае непреднамеренного использования команды chmod -R 777 *.* из корневой директории(или в аналогичных ситуациях). В комментариях разъяснена работа программы:

#!/usr/bin/perl -w

use strict;
use File::Find;

my ($test, $dir, $db, $pwd, $tmp);

$db="/home/user/cgi/xxx.dat";

###################
#program section  #
###################

&exc(); #read exceptions
unlink $db if !-z $db and $ARGV[0] eq 'r';
#стираем файл старой базы при команде r в случае если он ненулевого размера

find \&read => "$dir" if $ARGV[0] eq 'r';
#начать сканировать поддиректории если с командной строки пришло r

rewrite() if $ARGV[0] eq 'w';
#начать восстанавливать права на файлы, если с командной строки пришло w

##################
#subroutines     #
##################

sub read {#чтение прав
  $test=sprintf "%04o" => (stat($File::Find::name))[2] & 07777;
  #получить права на файл ли директорию
  &readchmod("$File::Find::name\t$test\n");
  #вызов подпрограммы для записи базы
}

sub readchmod{#запись прав
  open F, ">>$db" or die "Can't open $db: $!";
  print F $_[0];
  print "$_[0]"; #смотрим, что записывается
  close F;
}

sub rewrite{#перезапись прав
  open F, "<$db" or die "Can't open $db: $!";
  while(){ chop; #читаем построчно в $_ и отъедаем от него перевод
каретки
    my ($file, $chmod) = split /\t/;
    qx [chmod $chmod $file]; #даем системную команду chmod
    print "$chmod\t=>\t$file\n"; #смотрим, что делает программа
  } close F;
}

sub exc{
  do{print "Type './chmod.pl ?' or './chmod.pl h'\n"; exit 0}
    if $#ARGV==-1;#обрабатываем пустой ввод вида ./chmod.pl

  do {print "Your command must be 'w', 'r', 'h' or '?'!\n"; exit 0}
    if $ARGV[0]!~m%^[wr?h]$% and $#ARGV!=-1;
  #обрабатываем все остальные буквы, кроме необходимых

  do{ print qq~
Программа создает базку пермишнов на файлы и директории на
случай экстренных ситуаций вроде неправильного или случайного
использования команды chmod -R 777 из корневой директории.

chmod.pl [w|r|h|?] [/полный/путь/до/директории]

Для указания директории, от которой будет создаваться база
пермишнов, нужно ввести команду  "r /path/you/dir"

Для создания базы на права для файлов и дирректорий
Вы должны ввести "r".

Для восстановления прав на файлы и директории вы должны
ввести команду "w".

Справка по командам "?" или "h".

Второй аргумент должен быть полным путем к директории, от которой нужно
начинать рекурсивно сохранять права. По умолчанию стоит текущая
директория. Например если Вы запустили программу из корневой директории,
 то текущей директорией начала просмотра подкаталогов будет считаться
корневая директория, если в файле /home/user/.shrc внесена переменная
окружения $ENV{PWD}.

  ~; exit 0}
    if $ARGV[0]=~m!^[?h]$!; #выводим хелп

  if($ARGV[1] eq ''){#есл не ввели второго аргумента в командной строке
                     #то определяем переменную $dir
    #while(my ($k, $v)=each %ENV){print "$k\t=>\t$v\n"}
    #смотрим, что содержит переменная окружения,
    #содержащаяся в /home/user/.shrc
    $dir=$ENV{PWD};
    #определяем директорию запуска скрипта, чтобы с этой точки начать
    #поход по поддиректориям
  } else {
    -d $ARGV[1] or die "$!";#если то, что пришло вторым аргументом
                            #директория, то идем дальше, иначе читаем
                            #ошибку
    $dir=$ARGV[1];
  }

  return 1;
}
Если нашли a lot of bugs - пишите.

31.01.2002

Извлечение и запись информации в *.mp3

Считать информацию, хранящуюся в *.mp3 файле, можно при помощи модуля MP3::Info. Нехитрая програмка, вытаскивающая данные о той или иной записи:
#!/usr/bin/perl

my $file="/root/test.mp3";

use MP3::Info;

my $tag = get_mp3tag($file);
my $info = get_mp3info($file);

print "$_\t=>\t$info->{$_}\n" for sort keys %$info;
print "$_\t=>\t$tag->{$_}\n" for sort keys %$tag
Программа выдаст примерно следующее:
[root@www MP3-Info-1.00]# ./u.pl
BITRATE =>      160
COPYRIGHT       =>      0
FRAMES  =>      93498
FRAME_LENGTH    =>      49
FREQUENCY       =>      44.1
LAYER   =>      3
MM      =>      3
MODE    =>      0
MS      =>      72.0499999999902
PADDING =>      0
SECS    =>      229.07205
SIZE    =>      4581441
SS      =>      49
STEREO  =>      1
TIME    =>      03:49
VBR     =>      0
VERSION =>      1
ALBUM   =>      Ist der Ruf erst ruiniert...
ARTIST  =>      Tic Tac Toe
COMMENT =>      http://www.delit.net
GENRE   =>      Rock
TITLE   =>      Lдstern
TRACKNUM        =>      32
YEAR    =>      2000
[root@www MP3-Info-1.00]#
Обращаться к хешам, которые возвращаются функциями, можно как и при работе с perl -e 'print "$k\t=>\t$v\n" while(($k, $v)=each %ENV)'

Собственно модуль так-же умеет записывать информацию о записи в mp3. файл, а как это сделать читайте в man MP3::Info.

Удачи! Пишите письма!


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное