FAQ Perl .............

Полезные ссылки:
Метеоцентр.Азия - наш сайт с высокодетализированными прогнозами погоды по пунктам Pоссии и мира
Облегчённая версия Метеоклуба (для смартфонов)

FAQ Perl .............

Сейчас в Метеоклубе:
Участников - 1 [ Sunspot ]
Максимальное одновременное количество посетителей: 308 [2 Ноя 2013 22:42]
Гостей - 296 / Участников - 12

 - Начало - Ответить - Статистика - Pегистрация - Поиск -

МЕТЕОКЛУБ : независимое сообщество любителей метеорологии (Европа и Азия) : ФОРУМ О ПОГОДЕ И ПРИРОДЕ / Компьютерная техника и интернет в метеорологии / FAQ Perl .............
Автор Сообщение
Corvus
Автор сайта

###Corvus###
# Дата: 23 Янв 2008 13:02


Осваиваю язык программирования Perl.

Буду в эту ветку складывать найденные интересные материалы по теме, может кому-то пригодится.

Corvus
Автор сайта

###Corvus###
# Дата: 23 Янв 2008 13:03


Какие самые лучшие книжки про Перл?

Две классические книги по перлу, имееются в русском переводе и продаются в магазинах:

Рандал Шварц, Том Кристиансен.
Изучаем перл (aka Lama book)

Ларри Уолл, Том Кристиансен, Рандал Шварц.
Programming Perl (aka Camel book)

Lama book - учебник для начинающих,
Camel book - справочное руководство.

Эти книги есть в инете в отсканированном виде,
но лучше не жалеть денег и купить книги в "бумажном" варианте, они того стоят.

Вот ещё список книг:

http://books.dore.ru/bs/f6sid14.html


Некоторые полезные статьи есть тут:

http://citforum.ru/internet/perl.shtml

Corvus
Автор сайта

###Corvus###
# Дата: 23 Янв 2008 13:03


Неочевидные фишки Perla

$a||=1 то же самое, что и $a=1 unless $a

получение размера массива: scalar(@a) или @a+0 ну или общеизвестное $#a+1

чтение списка файлов @files=<*.pl> или, при использовании подстановок, @files=glob($filter)

# ******************************************


Чтение файла в массив

use FileHandle;

my @text = (new FileHandle("<file") or die "$!")->readlines();


# ******************************************


Сортировка хэша по значениям

print "$_ = $h{$_}\n" for( sort { $h{$a} > $h{$b} } keys %h);


# ******************************************


Использование Net::FTP
use Net::FTP;

$ftp = Net::FTP->new("ftp.narod.ru", Passive => 1, Debug => 1)
or die "Cannot connect to ftp.narod.ru: $@";

$ftp->login( $login, $passwd )
or die "Cannot login ", $ftp->message;

$ftp->cwd("/warez")
or die "Cannot change working directory ", $ftp->message;

$ftp->put("index.html")
or die "Cannot send file ", $ftp->message;

$ftp->quit;


# ******************************************


Кодировка ->транслит

sub translit
{
my $text = shift;
$text =~ y/абвгдеёзийклмнопрстуфхъыьэ/abvgdeezijklmnoprstuf h'y'e/;
$text =~ y/АБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЬЭ/ABVGDEEZIJKLMNOPRSTUF H'Y'E/;
my %mchars = ('ж'=>'zh','ц'=>'ts','ч'=>'ch','ш'=>'sh','щ'=>'sch ','ю'=>'ju','я'=>'ja',
'Ж'=>'Zh','Ц'=>'Ts','Ч'=>'Ch','Ш'=>'Sh','Щ'=>'Sch' ,'Ю'=>'Ju','Я'=>'Ja');
for my $c (keys %mchars) {
$text =~ s/$c/$mchars{$c}/g;
}
return $text;
}



# ******************************************

Corvus
Автор сайта

###Corvus###
# Дата: 23 Янв 2008 13:04


Как инсталлировать модуль у себя в директории

Для этого вам необходимо выбрать, где это будет делаться. Для примера,
в $HOME/lib/perl5. Необходимо создать эти директории, если их нет:
mkdir ~/lib
mkdir ~/lib/perl5
Затем, при генерации Makefile для модуля, вы должны указать, где вы хотите инсталлировать модуль:
perl Makefile prefix=$HOME
Все остальные шаги без изменений. В результате вы получите альтернативное место, где у вас будут находиться модули.

Для того, чтобы их использовать, есть несколько путей:
1. указывать при запуске perl в командной строке:
perl -I$HOME/lib/perl5 -I$HOME/lib/perl5/site_perl script.pl
2. завести переменную шелла PERL5LIB:
для sh (bash,zsh,ksh)
PERL5LIB=$HOME/lib/perl5:$HOME/lib/perl5/site_perl
export PERL5LIB
для csh (tcsh)
setenv PERL5LIB $HOME/lib/perl5:$HOME/lib/perl5/site_perl
3. указывать в начале скриптов дополнительные библиотеки:
use lib "/home/you/lib/perl5";
use lib "/home/you/lib/perl5/site_perl";
Данный случай подходит к CGI-скриптам, которые не наследуют ваших переменных окружения.

Скачивание и установка вручную -- достаточно сложное занятие, требующее постоянного вмешательства с вашей стороны. Можно простым способом: сделать su (желательно), набрать perl -MCPAN -e shell. Если это первый запуск модуля CPAN, вам задатут серию вопросов на тему URL вашего любимого зеркала CPAN. После этого все просто: если вы знаете название модуля или библиотеки, то набираете, скажем, install Net::NNTP. Тогда этот модуль (для работы с NNTP) сам ищется на CPAN, сам скачивается, компилируется, устанавливается. Все, поставили, можно выходить и использовать вновь установленный модуль. Если название точно не известно, то набираем там же help и используем различные команды поиска типа i NNTP.

Если нет root-привилегий, при использовании CPAN-модуля вам необходимо сконфигурировать его таким образом, чтобы он сам инсталлировал модули туда, куда вы укажете. Для этого вам необходимо подредактировать файл ~/.cpan/CPAN/MyConfig.pm: указать в строке 'makepl_arg' => q[prefix=/home/you], и теперь всегда при автоматической инсталляции модули будут ставится к вам в $HOME/lib/perl5
Более подробно обо всем этом можно прочитать в документации к ExtUtils::MakeMaker.

Corvus
Автор сайта

###Corvus###
# Дата: 23 Янв 2008 13:05


Как написать модуль?

Простейший случай:

Сам модуль представляет из себя файл с именем MyModule.pm следуещего содержания:
package MyModule;
require Exporter;

@ISA = qw(Exporter);

@EXPORT = qw(идентификаторы для экспорта: подпрограммы, имена переменных и пр.);
# Теперь после того, как вы напишите use MyModule в своей программе, у вас все
# упомянутые здесь идентификаторы станут видны. Этот метод не рекомендуется,
# так как вы "засоряете" именное пространство программы.

# И/или
@EXPORT_OK = qw(идентификаторы для экспорта: подпрограммы, имена переменных и пр.);
# Идентификаторы, прописанные здесь будут видны в Вашей программе как
# MyModule::Идентификатор (подпрограммы) или $MyModule::Идентификатор
# (переменные)
# Или, Вы можете написать use MyModule qw(Ид1 Ид2 $Ид3); и все будет как в
# первом случае. Это рекомендуемый вариант.

... ваши подпрограммы и пр ....

1; # Обязательно, это конец модуля; после точки с запятой нужно нажать Enter (то есть добавить перевод строки)

В программе, использующей модуль, пишем:
use MyModule qw(...);

(Источник: http://www.opennet.ru/docs/RUS/perl-ammosov/perl_a .html )

Corvus
Автор сайта

###Corvus###
# Дата: 23 Янв 2008 13:05


Как использовать DBI?

DBI -- это интерфейс прикладных программ к СУБД, использующим SQL в качестве языка запросов. Cам DBI определяет только набор функций, переменных и соглашений. Вся непосредственная работа выполняется Database Drivers (DBD) -- модулями, обеспечивающими связь с СУБД. DBI только обеспечивает стандартный интерфейс для этих драйверов.

Полная схема архитектуры при работе DBI выглядит примерно так:

+----------------------+
| Прикладная программа |
+----------------------+
| DBI |
+----------------------+
| DBD |
+----------------------+
| СУБД |
+----------------------+


Подсоединение к СУБД

обеспечивается при помощи метода connect класса DBI:

$dbh = DBI->connect($dsn, $user, $auth, {options});

$dbh - это объект, при помощи его методов осуществляются взаимодействия с СУБД.
$dsn - строка, определяющая к какой базе данных подсоединятся и другие параметры. Зависит от DBD. На сегодняшний момент стандарта нет, но рекомендовано использовать стиль ODBC:
'dbi:<имя DBD>:databasename=<название БД>;host=<Имя хоста>;port=<порт>';
$user Имя пользователя.
$auth Нечто, авторизующее пользователя. Обычно пароль.

options - параметры DBI, передаются через анонимный хеш. В настоящее время понимаются три параметра:
* RaiseError, если установлен, то при любой ошибке DBI убивает программу
* PrintError, если установлен, то при ошибке DBI вызывает warn
* AutoCommit -- определяет порядок работы с транзакциями.

Например:
$dbh = DBI->connect('dbi:Pg:dbname=apavel', 'apavel', 'SomeSecret',
{RaiseError=>1, AutoCommit=>0});
Означает: Подсоедение к СУБД PostgreSQL, к базе данных apavel, с именем пользователя apavel и паролем. Все ошибки будут вызывать die, что удобно при отладке, а все изменения будут внесены только при подтверждении (commit) транзакций.

Отсоединение обеспечивается при помощи метода disconnect: $dbh->disconnect();


Механизм курсоров и подготовки запросов

При работе с базами данных при помощи DBI используюся курсоры -- специальные объекты, обеспечивающие последовательный доступ к результатам запросов. (В простейших случаях можно обойтись и без них, я расскажу об этом дальше.)

Пример таблицы, используемой в дальнейшем:
create table foo (
bar varchar(50),
baz int
)

Получение данных
$cursor = $dbh->prepare('select bar, baz from foo');
# теперь $cursor -- курсор, и его необходимо исполнить
$cursor->execute;
# После исполнения запроса, результат можно получить из курсора при помощи
# метода fetchrow_array
while (($bar, $baz) = $cursor->fetchrow_array) {
print "bar is: $bar, baz: $baz\n";
}

Placeholders
Очень часто бывает надо подготовить какой-либо запрос, а потом использовать его с разными значениями данных. DBI предлагает для механизм placeholders: в запросе на месте таких данных указываются вопросительные знаки, а сами значения передаются в метод execute() курсора. Например:
$cursor = $dbh->prepare('select bar from foo where baz=?');
$cursor->execute($baz);
Особенно удобно это в случае вставки данных:
$cursor = $dbh->prepare('insert into foo(bar, baz) values(?, ?)');
while ( ... ) {
$cursor->execute($bar, $baz);
}
Таким образом, СУБД разбирает запрос только один раз, а затем просто исполняет его, что экономит время. (Естественно, это верно только для DBMS с раздельными parse и execute, сейчас ни MySQL, ни PostgreSQL такое не поддерживают, поэтому их реализации DBD просто сохраняют запрос переданный $dbh->prepare() и затем подставляют в него данные при каждом $sth->execute().)
К тому же использование placeholders вместо "прямого" внедрения переменных в текст запроса повышает безопасность работы вашего скрипта.

Работа без курсоров
DBI предоставляет несколько методов для такого рода работы:

Методы для запросов:
* selectrow_array Возвращает одну строку запроса в виде массива,
* selectall_arrayref Возвращает весь ответ сервера в виде массива ссылок на массивы.

Методы для выражений, не возвращающих значений
* do исполняет запрос
Пример:
#получить значение bar при baz=3
($bar) = $dbh->selectrow_array('select bar from foo where baz=3');

# установить baz в некоторое значение при bar='somestring'
$dbh->do("update set baz=1 where bar='somestring'");

Как работать с записями кусочками: первые N записей, следующие N...?
Можно несколькими способами:
1. Самый грубый и не эстетичный -- просто прокручивая курсор скриптом:
# выбираем ВСЕ записи из таблицы (очень не рекомендуется так делать)
$c = $dbh->prepare('select baz, bar from foo');
$c->execute;

# если нужна последовательность с 26 по 50, то:
for ($k = 0; $k < 26; $k++) {
$c->fetchrow_array;
}

# теперь можно вывести данные
print "<table border=1><tr><th>bar</th><th>baz</th></tr>\n";
while (($bar, $baz) = $c->fetchtrow_array) {
print "<tr><td>$bar</td><td>$baz</td></tr>\n";
}
print "</table>";
$c->finish; # Закрыть курсор


2. Используя курсоры СУБД
# Показан ситаксис PostgeSQL
$dbh->do('declare mycursor cursor for select bar, baz from foo');
$dbh->do('move 25');

# И теперь будем получать данные
$c = $dbh->prepare('fetch forward 25 in mycursor');
while (($bar, $baz) = $c->fetchrow_array) {
print ....;
}
$c->finish;
$dbh->do('close mycursor');

3. Для MySQL, авторы которого не в состоянии реализовать курсоры, можно использовать директиву LIMIT

$c = $dbh->prepare('select bar, baz from foo limit 26,25');
while (($bar, $baz) = $c->fetchrow_array) {
print ....;
}
$c->finish;


(Источник: http://www.opennet.ru/docs/RUS/perl-ammosov/perl_c .html )

Corvus
Автор сайта

###Corvus###
# Дата: 23 Янв 2008 13:06


Ещё один пример работы с БД


Как уже упоминалось выше, DBI обеспечивает единый интерфейс взаимодействия с различными системами управления базами данных. А DBD связывает этот интерфейс непосредственно с конкретной СУБД. В нашем случае это mysql. Исходя из этого, понятно, что для того, чтобы наша программа могла общаться и работать с базой данных, необходимо подключить модуль DBI и драйвер DBD. Это выполняется следующими операторами:

use DBI;
use DBD::mysql;

Для того чтобы мы могли выполнять SQL запросы к нашей базе данных, нам нужно установить логическое соединение с MySQL. Это мы выполняем при помощи метода объекта DBI. При этом он возвращает объект (дескриптор) соединения, который мы будем использовать для непосредственного общения с базой данных.
$dbh = DBI->connect('dbi: mysql:dbname=GRYADKA;host=127.0.0.1;port=3306','', '',0);

Вызывая метод connect, мы передаем ему некоторые параметры. Первый параметр определяет свойства соединения.
Эта строка имеет следующую структуру:
"dbi:<имя DBD>:dbname= <имя базы данных>;host=<имя хоста>;port=<номер порта>"

Далее в методе connect определяются имя пользователя, пароль и флаги соединения. Чтобы получить более подробную информацию, смотрите 'man DBI'.

Существует два способа работы с базами данных MySQL. Первый — так называемый механизм курсоров, а второй, соответственно, без них.
Для начала рассмотрим механизм курсоров.

Курсоры — это объекты Perl, которые обеспечивают последовательный доступ к результатам запросов.
Каждый курсор отвечает за закрепленный за ним запрос.
$cur = $dbh->prepare('select * from MAIN;');
$cur — это курсор, который для начала следует выполнить, используя метод execute:
$cur->execute;

Теперь, после выполнения запроса, чтобы получить результат запроса, используем метод fetchrow_array. Он поочередно возвращает массив полей результативной виртуальной таблицы. К примеру, чтобы вывести на экран все данные, воспользуемся циклом while:
while (($a00, $a01) = $cur->fetchrow_array)
{
$i++;
print "Record \#$i: a00 = $a00, a01 = $a01. \n";
}

Очень часто бывает необходимо подготовить запрос и после, при его выполнении, передавать ему различные данные. Это довольно просто решается при помощи механизма placeholders:
$cur = $dbh->prepare('insert into MAIN values(?,?)');
где вопросительные знаки следует заменить на значения переменных, переданных в качестве параметров метода execute:
$a00 = 2;
$a01 = 'second record';
$cur->execute($a00, $a01);
Для того чтобы закрыть курсор, необходимо выполнить метод finish.
$cur->finish;

Курсоры - очень удобный инструмент в технологии DBI, однако можно обойтись и без них.

Существует ряд методов, которые вполне неплохо заменяют курсоры:
selectrow_array — возвращает одну строку запроса в виде массива;
selectall_arrayref — возвращает весь ответ сервера в виде массива, ссылка на массивы;
do — выполняет запрос, ничего не возвращая (удобно при работе с insert, update и пр.)

Например:
($a01) = $dbh->selectrow_ar-ray('select a01 from MAIN where a00=1;');
# получаем значение $a01 равное 'Hello world!'
$dbh->do('update set a01 = 'hello world' where a00 = 1;');
# изменяем значения поля a01 на 'hello world', там где a00=1
И, наконец, для того чтобы разорвать соединение с MySQL, необходимо выполнить метод disconnect.
$dbh->disconnect;

(Источник: http://sdteam.com/?tid=1816 )

Corvus
Автор сайта

###Corvus###
# Дата: 23 Янв 2008 13:07


Краткий обзор sftp и scp

Давайте сосредоточим внимание на sftp and scp.
Первый (Secure File Transfer) - ftp-подобный клиент, который может быть использован для передачи файлов по сети.
Он не использует FTP демонов (ftpd или wu-ftpd) для соединения, что позволяет существенно повысить уровень защиты. Анализируя журналы нашей системы за последний месяц, мы обнаружили, что 80% атак было направлено на wu-ftpd. Использование sftp прозволяет отключить потенциально опасный wu-ftpd.

Второй (Secure Copy) используется для защищенного копирования файлов по сети. Это - замена небезопасной команды rcp.

Sftp и scp не требуют никакого специально выделенного сервера, так как эти две программы соединяются с ssh сервером. Чтобы использовать sftp и scp вставьте следующую строку в конфигурационный файл /etc/ssh2/sshd2_config:


subsystem-sftp sftp-server

после этой модификации перезапустите sshd.
Учтите, что Вы можете пользоваться sftp и scp только при соединении с хостом, где запущен sshd.
Sftp
Sftp использует ssh2 при соединении, это означает, что передаваемые файлы защищены настолько, насколько это возможно.
Есть два основных преимущества при использовании sftp вместо ftp:

1. Пароли никогда не передаются отрытым текстом, что предотвращает атаки с использованием сниферов (sniffer).
2. Данные шифруются во время передачи, затрудняя прослушивание и подтасовку.

Использование sftp2 действительно просто. Предположим, что Вам нужно соединиться с помощью sftp с хостом host1, имея на ней аккаунт myname. Используйте команду:

sftp myname@host1

некоторые опции могут быть заданы из командной строки (см. man sftp)

Когда sftp2 будет готов к выполнению команд, высветится приглашение sftp>. В справочном руководстве приведен полный перечень возможных команд, некоторые из них приведем здесь:

* quit:
Выход из приложения.
* cd directory:
Сменить текущий удаленний каталог.
* lcd directory:
Сменить текущий локальный каталог.
* ls [ -R ] [ -l ] [ file ... ]:
Перечень файлов на удаленном сервере, для каталогов - их содержание. Когда задана опция -R, дерево каталогов просматривается рекурсивно. (По умолчанию подкаталоги запрошенного каталога не видны). С опцией -l показываются также права, владельцы, размер и дата модификации. Если никакие опции не заданы, просматривается содержание . . В настоящее время опции -R и -l не совместимы.
* lls [ -R ] [ -l ] [ file ... ]:
То же, что и ls, но для локальных файлов.
* get [ file ... ]:
Передает указанные файлы с удаленной точки на локальную. Каталоги рекурсивно копируются с их содержимым.
* put [ file ... ]:
Передает указанные файлы с локальной точки на удаленную. Каталоги рекурсивно копируются с их содержимым.
* mkdir dir (rmdir dir):
Пытается создать (удалить) каталог dir.

sftp2 поддерживает шаблоны (wildcards) в командах ls, lls, get, и put. Формат описан в справочном руководстве sshregex

Так как sftp использует крипто, это имеет свои минусы: уменьшение скорости соединения (примерно в 2-3 раза по моему опыту), но это не так важно по сравнению с проблемами защиты сети.
Запущенный в нашей локальной сети Network Sniffer вылавливал в среднем 4 пароля в час из ftp-соединений. Введение sftp как стандартного протокола передачи файлов помогло устранить эту проблему защиты.
Scp
Scp2 (Secure Copy) применяется для надежного копирования файлов по сети. Используется ssh2 для передачи данных, а это означает такую же надежную аутификацию, как и в ssh2
Возможно это самый простой способ передачи файлов на удаленную машину. Предположим, Вы хотите скопировать файл filename из каталога d local_dir на Ваш аккаунт myname в каталог remote_dir на машине host1. Для применения scp введите в командной строке:

scp local_dir/filename myname@host1:remote_dir

таким образом файл filename скопирован с тем же именем. Могут быть использованы wildcards (см. sshregex man page).
Команда

scp local_dir/* myname@host1:remote_dir

копирует все файлы из каталога local_dir в каталог remote_dir на host1.
Команда:

scp myname@host1:remote_dir/filename .

копирует файл filename из remote_dir на host1 в локальный каталог.
Scp поддерживает много параметров и позволяет передавать файлы с одной удаленной машины на другую, как показано в следующем примере :

scp myname@host1:remote_dir/filename myname@host2:another_dir

См. man для полной ясности.

Очевидно, используя scp, Вы должны знать структуру каталогов на удаленной машине, поэтому на практике предпочитают sftp.

Управление ключами ssh
Пакет SSH содержит две программы для управления аутификационными ключами, позволяя пользователю соединяться с удаленной машиной без ввода пароля или кодовой фразы. Это ssh-agent и ssh-add.
ssh-agent

Читаем man ssh-agent: "ssh-agent2 - это программа для хранения аутенфикационных частных ключей. Идея в том, что ssh-agent2 стартует в начале Х-сессии или login-сессии, и все другие окна или программы стартуют как дочерние от ssh-agent2 (обычные команды запуска Х или командной оболочки). Программы, стартовавшие под агентом, наследуют подключение к нему, и агент автоматически использует аутенфикационный публичный ключ при регистрации на других машинах с использованием ssh".

Существуют два способа использовать ssh-agent в зависимости от использования Вами xdm.
В случае использования xdm необходимо отредактировать файл .xsession, расположенный в каталоге $HOME. Возможны два способа:
Скопируйте .xsession в .xsession-stuff и измените .xession так, чтобы он содержал только строку:


exec ssh-agent ./.xsession-stuff

Альтернативно откройте файл .xsession, найдите строки, содержащие "exec program" и измените их на "exec ssh-agent program".

Выйдите из X-сессии и перестартуйте Х. ssh-agent запустит X-сессию как собственный дочерний процесс и будет ждать ssh ключ, чтобы внести его в свою базу.

Если xdm не запущен, процедура использования ssh-agent еще проще, потому что Вы можете запустить Х с помощью команды:

ssh-agent startx

Таким образом мы получили рабочую версию ssh-agent.
ssh-add
Как только ssh-agent будет запущен, Вы можете идентифицироваться в его базе с помощью команды ssh-add. Вы можете идентифицироваться только из дочернего от ssh-agent процесса, иначе увидите сообщение об ошибке:


Failed to connect to authentication agent - agent not running?

Использование ssh-add несложно: в командной строке введите:

ssh-add

ssh-add просмотрит файл $HOME/.ssh2/identification, который содержит имена частных ключей для аутификации. Если этот файл не существует, будет использовано стандартное имя для частных ключей(т.е. $HOME/.ssh2/id_dsa_1024_a).
Если какой-либо публичный ключ требует кодовой фразы, ssh-add запросит ее у пользователя, как в следующем примере:

Adding identity: /home/matt/.ssh2/id_dsa_1024_a.pub
Need passphrase for /home/matt/.ssh2/id_dsa_1024_a (..)
Enter passphrase:

Вы можете получить список всех идентифицировавшихся в настоящее время с помощью агента при помощи команды ssh-add -l:

Listing identities.
The authorization agent has one key:
id_dsa_1024_a: 1024-bit dsa, (...)

Заключение и полезные ссылки
Многие пользователи telnet, rlogin, ftp возможно не понимают, что их пароли передаются по незащищенной сети, но это так. Использование защищенных протоколов позволит безопасно передавать данные по небезопасной сети.
SSH, шифруя весь трафик, эффективно предотвращает прослушиваниеe, подмену подключения и другие сетевые атаки.

(Источник: http://gazette.linux.ru.net/lg64/articles/rus-dell omodarme.html )

Ваш ответ

          Отменить *Что это?

 » Логин  » Пароль 
 
 


Поддержка: miniBB forum software © 2001-2024