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

суббота, 16 января 2016 г.

Еще раз про юникод в perl и злосчастный Wide character in subroutine entry

Многие perl скриптеры  порой впадают в ступор от Wide character in subroutine entry. Хорошо, если знают хотя бы примерно о том, что такое Wide character, хуже , если нет. Хорошо, если начинают копать матчасть и разбираются с в общем-то нехитрой работой с юникодом в perl, хуже, если начинают наобум тыкать в use utf8, encode/decode... На выходе порой может получиться забавная инструкция с кучей вызовов на всякий случай.. она может даже будет работать, но подобный модуль будет доставлять всем вокруг головную боль. Итак, все просто: 1. если имеешь дело с данными из внешнего источника - проверяй их перед употреблением на is_utf8 и дальше действуй по обстоятельствам: либо кодируй, либо декодируй - но осознанно. 2. если имеешь дело со строковыми константами , то достаточно сказать use utf8 , чтобы для интерпретатора все константы скрипта были помечены не как последовательность байт, а именно как юникод-строка. 3. чтобы перевести в последовательность байт из юникода - decode 4. чтобы перевести из последовательности байт в юникод - encode помните о том, кто будет вас дергать и описывайте свои входы и выходы а также свою политику относительно внутренней работы со строками ( работаете как с последовательностю байт или как со юникод-строками ) и все будет хорошо.

вторник, 12 февраля 2013 г.

How to improve Test::Class to conrol test ttl

To  make Test::Class control test-suites time-to-live you could inherit Test::Class and redefine runtests method..

For example:

package TTL::Test::Class;
use base qw(Test::Class);
use Test::More;
use POSIX ":sys_wait_h";
use constant DEFAULT_TIMEOUT => 60;
# переопределяем метод запуска тестов 
sub runtests{
    my $t = DEFAULT_TIMEOUT;                                           
    my $pid = fork;                         
    my $child_ret_code;                           
    if( $pid > 0 ){ # parent process                                         
       #child waiting loop
       my $ok_flag = 0;                                                  
       for(my $i=0; $i < $t; $i++){                                       
          if(waitpid($pid, WNOHANG)){                                           
               $child_ret_code = $?/256;                                       
               ok($child_ret_code);                                             
               $ok_flag = 1;                                                  
               last;                                                            
          };                                                                              
          sleep(1);
       };
       if( not $ok_flag ){
         diag "Killing test by its timetolive...";
         kill TERM =&gt; 
         $pid;
         return $ok_flag;
       };
       return $child_ret_code;                                                  
    } elsif( $pid == 0 ) { #child                                               
        exit $self->SUPER::runtests;                                         
    } elsif ( not defined($pid) ) { #unsuccessfull fork                         
        die "Cannot fork child process: $!";                                    
   }                                                                            
} 
1;

I think, we don't need SIGCHILD here..

source

пятница, 2 ноября 2012 г.

Установка DBD::Oracle на linux

Если при установке CPAN-модуля возникли проблемы подобные этой:
Can't load '/root/.cpan/build/DBD-Oracle-1.52-2Zd5mX/blib/arch/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: libclntsh.so.11.1: невозможно открыть разделяемый объектный файл: Нет такого файла или каталога at /usr/lib64/perl5/DynaLoader.pm line 200
на стадии make или make test, то скорее всего не установлены переменные окружения: ORACLE_HOME и LD_LIBRARY_PATH
$ sudo -s
# export ORACLE_HOME=путь к домашней директории ORACLE
# export LD_LIBRARY_PATH=$ORACLE_HOME/lib
# cpan DBD::Oracle

среда, 12 октября 2011 г.

perl: несколько проблем установкой GD и способы их решения

Сегодня потребовалась установка CPAN-модуля GD.pm на один из серверов.
При установке возникла ошибка:

perl -MCPAN -e 'install "GD"'

we get the following fatal error message:
**UNRECOVERABLE ERROR**
Could not find gdlib-config in the search path. Please install libgd
2.0.28 or higher.
If you want to try to compile anyway, please rerun this script with
the option --ignore_missing_gd. 
...

Ок, пытаюсь ставить libgd из репозитория (Debian 5 Lenny):

$ apt-get install libgd2-xpm
$ apt-get install libgd2-xpm-dev

Пробую ставить опять perl-модуль - та же ошибка.

Раскопки и гуглеж позволили выяснить, что дело в том, что в штатный пакет не входит скрипт gdlib-config.

Решить проблему можно , поставив libgd самостоятельно, взяв исходники, например, отсюда

$ wget http://www.boutell.com/gd/http/gd-2.0.28.tar.gz
$ tar xvf gd-2.0.28.tar.gz
$ cd gd-2.0.28
$ ./configure --prefix=/usr
$ make
$ sudo make install

После этого повторяем попытку поставить GD.pm.

Может возникнуть еще одна проблема:
Manifying blib/man3/GD::Polygon.3pm
  LDS/GD-2.46.tar.gz
  /usr/bin/make -- OK
Warning (usually harmless): 'YAML' not installed, will not store persistent state
Running make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/GD..........Testing using png support.
t/GD..........FAILED test 10                                                 
        Failed 1/12 tests, 91.67% okay
t/Polyline....ok                                                             
Failed Test Stat Wstat Total Fail  List of Failed
-------------------------------------------------------------------------------
t/GD.t                    12    1  10
Failed 1/2 test scripts. 1/13 subtests failed.
Files=2, Tests=13,  1 wallclock secs ( 0.12 cusr +  0.02 csys =  0.14 CPU)
Failed 1/2 test programs. 1/13 subtests failed.
make: *** [test_dynamic] Ошибка 255
  LDS/GD-2.46.tar.gz
  /usr/bin/make test -- NOT OK
//hint// to see the cpan-testers results for installing this module, try:
  reports LDS/GD-2.46.tar.gz
Warning (usually harmless): 'YAML' not installed, will not store persistent state
Running make install
  make test had returned bad status, won't install without force


Подозрение на отсутствие библиотеки libpng. Ставим ее:
# apt-get install libpng3 libpng3-dev

Опять пробуем ставить perl-модуль - опять то же самое.

Удаляем libgd, конфигурим , собираем и ставим ее заново.Делаем так, потому что изначально у нас не было libpng и , соответственно, libgd была собрана без ее поддержки. Надо пересобрать:

# в директории с исходниками GD
$ make clean 
$ ./configure --prefix=/usr
$ make 
$ sudo make install

После этого GD.pm должен установиться успешно.

пятница, 5 августа 2011 г.

Работа с cups в Perl

Если в системе используется служба печати cupsd, то в приложениях написанных на Perl можно довольно легко работать с установленными принтерами..

Вот простенький пример получения списка установленных принтеров в системе:


use Net::CUPS;
use Net::CUPS::Destination;
my $cups = Net::CUPS->new();
my @printers = $cups->getDestinations() or die "No printers";
foreach my $printer (@printers){
print 'Printer:',$printer->getName(),"\n";
}


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

Printer:SMB_HP1
Printer:SMB_HP2