Перенаправление STDOUT системных команд в консоль при выполнении perl

Posted in Новости on 19 октября, 2012 by admin

Иногда требуется вывести результат команды в консоль, причем результат по сути бесконечный ( например ping ). Стандартный скрипт результата не дал :

#!/usr/bin/perl

use strict;
use warnings;

my $tt = `ping ya.ru`;
print $tt;

потому как по сути все время работы пинга в переменную будет писаться вывод. Для наших целей потребуется модуль IPC::Open2 ( Inter Program Communication ).
Страница модуля — http://search.cpan.org/~jhi/perl-5.8.0/lib/IPC/Open2.pm

Пример работающего скрипта :


#!/usr/bin/perl

use strict;
use warnings;

use IPC::Open2;

my $HANDLE;

my $pid = open(HANDLE, "|ping ya.ru|");

print HANDLE "";
Tags: , ,

Отключение буферизации вывода в perl

Posted in Новости on 19 октября, 2012 by admin

При выполнении скриптов вида :

#!/usr/bin/perl

use strict;
use warnings;

for ( my $i = 0; $i < 10; $i++ ) {
print "Iteration - $i\n";
sleep(1);
}

На выходе мы будем иметь ситуацию, когда print всех операций будет выводиться только после полного выполнения цикла, что является нормальным явлением, так как стандартно буферизация включена. Чтобы ее отключить ( чтобы скрипт при каждой итерации выплевывал в консоль данные ) нам нужно изменить значение специальной переменной $| на отличное от нуля.

Пример готового скрипта :

#!/usr/bin/perl

use strict;
use warnings;
$| = 1;

for ( my $i = 0; $i < 10; $i++ ) {
print "Iteration - $i\n";
sleep(1);
}
Tags: , ,

использование reCAPTCHA в perl CGI

Posted in Новости on 13 октября, 2012 by admin

Модуль cpan — http://search.cpan.org/dist/Captcha-reCAPTCHA/lib/Captcha/reCAPTCHA.pm

Регистрируем домен в https://www.google.com/recaptcha и получаем PRIVATE_KEY и PUBLIC_KEY . Далее устанавливаем модуль Captcha::reCAPTCHA . По образцу со страницы модуля пишем простой скрипт :


#!/usr/bin/perl

use CGI;
use Captcha::reCAPTCHA;
$cgi = CGI->new();
my $c = Captcha::reCAPTCHA->new;
print "Content-type:text/html\r\n\r\n";
print <

HTML
my $result = $c->check_answer(
"PRVATE_KEY", $ENV{'REMOTE_ADDR'},
$cgi->param(recaptcha_challenge_field),
$cgi->param(recaptcha_response_field)
);
if ( $result->{is_valid} ) {
print "Yes!";
}
else {
$error = $result->{error};
}
print $c->get_html( 'PUBLIC_KEY', $error );
#

print <

HTML


Как видите, мы описали CGI, и поместили в разрезе функцию ввода и проверки капчи :

my $result = $c->check_answer(
"PRVATE_KEY", $ENV{'REMOTE_ADDR'},
$cgi->param(recaptcha_challenge_field),
$cgi->param(recaptcha_response_field)

и функцию вывода ответа :

print $c->get_html( 'PUBLIC_KEY', $error );

Сама переменная правильности ответа ( Да/Нет ) находится тут — $result->{is_valid}

Tags: , , ,

Цикл, зависимый от длины массива.

Posted in Новости on 19 июля, 2012 by admin

my @arr = ( 1 2 3 ) — наш массив
my $count = $#arr — количество членов массива, начиная с единицы
for ( my $i=0; $i < $count; $i++ ) {} - индексы массивов начинаются с нуля, поэтому выставляем исходное значение в ноль и предел строго меньше.

Tags: ,

Wide character in print at. perl. punycode.

Posted in Новости on 19 июля, 2012 by admin

Ошибка возникает, когда мы читаем переменную/файл в утф-8, но на выходе получаем UNICODE.

open (DL, "pundom");

binmode (STDOUT, ":utf8"); ##### It is a fix

my @domains =

Tags: , ,