суббота, 16 апреля 2011 г.

Perl

Perl

Подпрограммы

Вместо слова "функция" в perl используется слово "подпрограмма" (subroutine). По-этому определение функции начинается со слова sub.
sub func1{ return 0; }
Внутри подпрограммы для объявления пременных используется ключевое слово my. Оно говорит, что переменная ограничена текущим блоком (или подпрограммой).
sub func1{
  my $content = "a";
  return $content;
}
print func1();
Если у функции нет аргументов, то её можно вызвать, опуская скобки:
print func1;

Переменные

переменная начинается с $, массив с @, а хэш с %
т.е. $v, @v и %v это разные вещи

$_

$_ — переменная по умолчанию, создаётся в циклах вида
foreach(@array){ .. }
т.е. цикл полностью выглядит как foreach $_(@array){ do smth with $_ ; }

@_

@_ — это массив аргументов подпрограммы
используется примерно так:
sub f {
my ($var1, $var2)=@_;
...
}
или так:
sub f {
my $x=shift || "значение по умолчанию переменной x"
..
}
или так:
sub f {
my $x=shift or die "incorrect use of function f";
my $y=shift || "0";
}
в этом случае первая переменная обязательна, вторая нет

про остальные переменные типа $/, $] и т.д. можно почитать в perldoc perlvar или perl5doc.ru/perlvar-table

Операторы

print "string", @a;

or и || отличаются приоритетом, если расставить скобки то получится:
(my $x=shift) or die ...
my $y=(shift || "0");

if

$true = 1;
if ($true){ ## входим, если условие выполняется
    print "ага";
}
unless ($true){ ## если условие не выполняется
    print "неа";
}


Модули

В Perl реализован механизм модулей. Подпрограммы и переменные объединяются в модули. Модули импортируются функцией use:
use имя_модуля;

Типы данных

Массив (список)

@days = (' Sun ' ,' Mon ',' Tue ',' Wed ',' Thu ',' Fri ',' Sat ');
print @days;
print @days[1];
print @days[1..5];

Хэш (словарь)

%hash1 = (
    'k1' ,'v1',       ## на мой взгляд, несколько странный способ записи.
    'k2','v2',
    'k3','v3' );
print $hash1{'k2'}, '<br>';
$hash1{'k4'} = 'v4';
print %hash1;
и можно использовать привычный способ записи:
%hash1 = (
    'k1' => 'v1',
    'k2'=>'v2',
    'k3'=>'v3' );

проверить наличие ключа в массиве
:
if ( exists( $_POST{'page'} ){
    print "ключ page существует";
}

Build-in functions

shift

Функция shift вытаскивает первый элемент из массива и возвращает его. Если функция вызвана без аргументов в теле основной программы, то она берёт первый элемент массива @ARGV, если вызвана из "подпрограммы", то берёт перый элемент массива @_

Файлы и папки

чтение файла

  open(FH, "<$filename") or die $!;
  while(<FH>)
  {
    $content .= $_;
  }
  close(FH);

список функций

удаление
$DB_FILE = "img.db";
unlink($DB_FILE) or die "Can't delete '$DB_FILE':  $!\n";
Если файл не существует - возникнет ошибка.
unlink может получить на вход список файлов.
проверить существование
$DB_FILE = "img.dbs";
unless (-e $DB_FILE){
    print "файл не существует";
}



Модули

Digest

Модуль, в котором находятся функции вычисления различных хэшей.
use Digest::MD5 qw(md5 md5_hex);
print md5_hex('dd');

Web

Вывести ошибки в браузер:
use CGI::Carp qw(fatalsToBrowser);

$_POST

sub populatePostFields {
    %_POST = ();
    read( STDIN, $tmpStr, $ENV{ "CONTENT_LENGTH" } );
    @parts = split( /\&/, $tmpStr );
    foreach $part (@parts) {
        ( $name, $value ) = split( /\=/, $part );
        $value =~ ( s/%23/\#/g );
        $value =~ ( s/%2F/\//g );
        $_POST{ "$name" } = $value;
    }
}
&populatePostFields;
print $_POST{"env"};

Скачивание файла частями

положим, нам надо скачать файл от начала, до 100 байта
use LWP::UserAgent;
$ua = LWP::UserAgent->new;
$res =  $ua->get( "http://localhost/img/2.png", 'Range', 'bytes=0-100' );
print $res->content;

Работа с БД

DBI

DBI - это стандартный интерфейс для работы с БД.

SQLite

Надо скачать модуль для работы с SQLite: search.cpan.org/<...>/SQLite.pm
и просто положить рядом со своим pl-скриптом.
use DBI;
$db = DBI->connect("dbi:SQLite:dbname=users.db","",""); # Подключаемся к базе данных. Если файла users.db не существует, то он будет создан автоматически
$db->do("create table users (user_name text);"); # Создаем новую таблицу в базе данных
$db->disconnect;


Полезные функции

file_get_contents

sub file_get_contents
{
  my $filename = shift;
  my $content = "";
  open(FH, "<$filename") or die $!;
  while(<FH>)
  {
    $content .= $_;
  }
  close(FH);
  return $content;
}


Комментариев нет:

Отправить комментарий