Показаны сообщения с ярлыком perl. Показать все сообщения
Показаны сообщения с ярлыком perl. Показать все сообщения

вторник, 15 ноября 2011 г.

mem #32

Мой первый скрипт на Perl.

#!/usr/bin/perl

$x=100; $y=100;
$dir_url = "http://lit-1/img";
$sm_dir_url = "http://lit-1/img/sm";
$sm_dir = "/www/img/sm";
$script = "g.pl";
$num = 0;
$mes = 15;
$r = 3;

sub err {print "Err: @_";exit;}

sub f_err {$_=~s/\</&lt;/g; $_=~s/\>/&gt;/g; $_=~s/\"/&quot;/g; $_=~s/:/\&\#58;/g;}
sub s {s/%([0-9A-Ha-h]{2})/pack("C", hex($1))/eg;}

sub tab
{
 $alls = int(($smnum-1)/$mes)+1;
 if ($ENV{DOCUMENT_URI} ne "") {$script="$ENV{DOCUMENT_URI}";}
 if ($f{page} > $alls) {err ("incorrect page number.");}
 for ($i=1;$i<=$alls;$i++)
 {
  $a=$page/$mes+1;
  if ($a ne $i) {$LINE .="|<a href=$script?g=$f{g}&page=$i> $i </a>";}
  else {$LINE .="| $i ";}
 }
 print qq~<head>
 <title>my_galery</title>
 <meta http-equiv="Content-Type" content="text/html; charset=KOI8-R">
 </head>
 <body bgcolor="FFFFFF" leftmargin="0"
  topmargin="5" marginwidth="0" marginheight="0">
 <table>
 <tr>
 <td align="center" colspan="5">
 <font size=1>$LINE |</font>
 </td>
 </tr>~;
 $msgs=$mes+$page;
 while ($msgs > $num + $page)
 {
  print "<tr>";
  for ($u=0;$u<$r;$u++)
  {
   $ee=$num + $u + $page;
   print "<td height=\"$y\" width=\"$x\" align=\"center\">";
   if ($smlist[$ee] ne "")
    {
     print "<a href=\"$script\?g=$f{g}&file=$smlist[$ee]&c=$captions[$ee]\">
            <img border=0 width=\"100\" src=\"$sm_dir_url/$smlist[$ee]\"
             alt=\"$captions[$ee]\"></a>";
    }
   else {print"\&nbsp\;";}
   print "</td>";
  }
  $num +=$r;
 }
 print "</tr></table></body></html>"; exit;
}

print "Content-type: text/html\n\n";
if ($ENV{'QUERY_STRING'} eq ''){err ("QUERY_STRING is empty!!! AAAAAAAAAAAA!!!!!");}
@p = split(/&/, $ENV{'QUERY_STRING'});
for (@p){$_ =~ &s; $_ =~ tr/+/ /; ($n, $v) = split(/=/, $_);$f{$n} = $v;$f{$n} =~ &f_err;}
if ($f{page} eq "") {$f{page}=1;}
$file = "$f{g}";
$page=($f{page}-1)*$mes;
if ($f{g} eq "") {err ("incorrect access")}
if ($file ne "")
{
 open (F,"$file") || err ("incorrect name of gallery.");
 while (<F>)
 {
  chop;
  ($key,$value) = split(/:/); $photos{$key} = $value;
 }
 close(F);
 for (sort keys %photos)
 {
  push (@smlist,$_);
  push (@captions,$photos{$_});
 }
 $smnum = @smlist;
}
else {err ("No tps.");}
if ($f{file} ne "")
 {
  print "
  <html>
  <head>
  <title>$f{c}</title>
  </head>
  <body>
  <center>
  <a href=\"javascript:history.back()\">
  <img border=0 src=\"$dir_url/$f{file}\" alt=\"$f{c}\">
  </a>
  </center>
  </body>
  </html>\n";
 }
else {tab();exit;}

Скрипт был написан в 2002-2003 году, когда я только начал изучать этот язык.

понедельник, 20 сентября 2010 г.

mem #24

Область видимости переменных. Для управления видимостью используются слова my, our, local. Ограничивается видимость блоком {}, файлом или пакетом. Простой пример:
#!/usr/bin/perl
use strict;
my $q=0;
our $a=1;
our $z=555;
{
my $q="null";
local $a="five";
print '$q = ',$q,"\t\$a = ",$a,"\t\$z = ",$z,"\n--\n";
}
print '$q = ',$q,"\t\$a = ",$a,"\t\$z = ",$z,"\n--\n";
Прочитай скрипт, запусти, помедитируй. Всё ли понятно?

mem #23

Ворч, это для тебя, как для начинающего. Ну и для меня, склероз свой порастрясти...
Приём данных из формы, очень простой скрипт:
#!/usr/bin/perl
use CGI;
use strict;
my $q = new CGI;
my $q->import_names('R'); # импорт данных в пространство имён R
open my $f, ">q.txt"; # открываем файл для записи.
# и пишем данные полученные из формы,
# обращение к содержимому поля происходит так: $NameSpase::fieldname.
print $f $R::mytextarea1, $R::mytextarea2;

четверг, 16 сентября 2010 г.

mem #22

Задача недели - найти способ соединяться с MS Exchange, читать и записывать в его базу контакты.

понедельник, 13 сентября 2010 г.

...#...

Поздравляю всех с днём программиста!
CMS разрабатывается вяло. Пока сделано - управление новостями, частично фотогалереями и начата работа над форумами.

четверг, 21 января 2010 г.

mem #12

Перевод грубый и приблезительный, пока не работал с этим модулем. Поработаю, перепишу.
НАЗВАНИЕ
  CGI::Ajax - перловый модуль для написания асинхронных веб приложений

СИНОПСИС
  use strict;
  use CGI;      # или любой другой CGI:: из handler/decoder
  use CGI::Ajax;
 my $cgi = new CGI;
  my $pjx = new CGI::Ajax( 'exported_func' => \&perl_func );
  print $pjx->build_html( $cgi, \&Show_HTML);
 sub perl_func {
  my $input = shift;
  # do something with $input
  my $output = $input . " was the input!";
  return( $output );
  }
 sub Show_HTML {
  my $html = <<EOHTML;
  <HTML>
  <BODY>
  Enter something: 
  <input type="text" name="val1" id="val1"
  onkeyup="exported_func( ['val1'], ['resultdiv'] );">
  <br>
  <div id="resultdiv"></div>
  </BODY>
  </HTML>
  EOHTML
  return $html;
  }
  Когда вы используете CGI::Ajax с приложением, оно отправляет собственный заголовок,
  можно его поскипать:
 my $pjx = new CGI::Ajax(
  'exported_func' => \&perl_func,
  'skip_header'   => 1,
  );
  $pjx->skip_header(1);
  
  print $pjx->build_html( $cgi, \&Show_HTML);
 *полнофункциональные примеры лежат в папке 'scripts/' дистрибутива*

ОПИСАНИЕ
  CGI::Ajax объектно ориентированный модуль предоставляющий уникальный механизм
  для использования perl асинхронно из HTML страниц с javascript.
  CGI::Ajax освобождает пользователя от написания большого количества кода,
  за исключением объединения экспортируемого метода с определеннм документом
  событием(таким как onClick, onKeyUp, и т.п.). CGI::Ajax так же хорошо 
  совмещается с HTML содержащим более сложный код javascript.

  CGI::Ajax поддерживает методы возвращающие один или множество
  результатов на страницу, и поддерживает возврат значений для множества
  DIV элементов на HTML странице.
  При использовании CGI::Ajax, URL для HTTP запросов GET/POST генерируется
  автоматически на основании вывода событий HTML и страница динамически
  обновляется получая данные из функций perl.
  CGI::Ajax поддерживает маппинг URL для своих функций, так что вы можете
  распределить код по нескольким скриптам.

  Кроме Class::Accessor, модуля используемого для генерации методов доступа
  CGI::Ajax, CGI::Ajax не требует установки дополнительных пакетов или системы
  управления контентом, и т.п.

  Мы добавили поддержку для других CGI handler/decoder модулей, таких как
  CGI::Simple или CGI::Minimal, но мы не можем протестировать их, так как
  работаем только с mod_perl2. CGI::Ajax проверяет наличие header() метода
  для объекта CGI и использует его. Если method() не доступен, он создаёт
  собственный минимальный заголовок.
  Мы стараемся свести генерируемый javascript к минимуму, но всё же предоставить
  пользователю разнообразные методы работы с CGI::Ajax. И ОЧЕНЬ мало javascript.

пятница, 20 ноября 2009 г.

mem #8

само удаление
unlink($0);

mem #7

Hash - это просто. Обозначается значком " % ", за ним идёт имя - %hash_name. Hash - ассоциативный массив, это значит что у каждого значения есть имя(ключ). Записать его можно по разному, обычно это делается так:
my %typical_hash = (
	'some_key_name_0' => 'something',
	...
);
либо так, но первая запись нагляднее:
my %typical_hash = (
	'some_key_name_0', 'something', ...
);
можно так:
my $typical_hash{'some_key_name_0'} = 'something';
...
инициализировать или очистить хэш можно так:
my %hash = ();
извлечь значение из хэша можно по ключу, вот так:
print $typical_hash{'some_key_name_0'};
извлечь значение ключа можно передав хэш функции keys():
print keys %typical_hash;
ключи и значения из хэша берутся с помощью each():
my ($key, $val) = each(%typical_hash);
для того, чтобы перебрать все значения и ключи хэша, необходимо положить функции в цикл:
print for keys %typical_hash;
и для перебора ключей со значениями:
while (my ($key, $value) = each(%typical_hash)) {
	print "ключ $key хранит значение $value\n";
}
либо
print "ключ ".$_." хранит значение ".$typical_hash{$_}."\n" for keys %typical_hash;
данные в хэше хранятся не упорядочено, отсортировать хэш по ключам можно так:
for my $key(sort keys %typical_hash) {
	my $val = $typical_hash{$key};
	print "$key\ => $val\n";
}
посчитать количество пар "ключ => значение" можно с помощью функции keys(), есть два способа:
#1.
print ''.keys %typical_hash ;
#2.
print scalar(keys %typical_hash);

четверг, 19 ноября 2009 г.

mem #6

quine - программа выдающая на выход свой исходник.
$_=q{$_=q{x};s/x/$_/;print};s/x/$_/;print
UPDATE:
open+0;print<0>