[Moscow.pm] tie на стандартные переменные

Mons Anderson inthrax на gmail.com
Вт Янв 25 03:53:29 PST 2011


вариант, позволяющий избежать данной проблемы:

setlocale POSIX::LC_MESSAGES => 'en_US.UTF-8';

(Я нахожу его правильным, т.к.считаю локализацию ошибок таким путем - злом. 
для локализации нужен I18N)

"правильный вариант"

--- mg.c
+++ mg.c
  if (SvPOKp(sv))
      SvPOK_on(sv);    /* may have got removed during taint processing */
+ if( PL_hints & HINT_UTF8 )
+     SvUTF8_on(sv);
  RESTORE_ERRNO;


On Sunday 23 January 2011 13:39:14 Ivan Petrov wrote:
> У Ларри Уолла есть пример когда используя tie перехватывают все обращения к
> $_.
>
> В перле есть старый баг, который видимо никогда уже не поправят: переменная
> $! всегда кривая, если используется use utf8
>
> =пример
>
> #!/usr/bin/perl
>
> use warnings;
> use strict;
>
> use utf8;
> use open qw(:std :utf8);
>
> open my $file, '<', 'abrakadabra/not-found'
>     or die "Ошибка открытия файла: $!";
>
> =конец примера
>
> соответственно выведет этот пример такую строку:
>
> =
> Ошибка открытия файла: ÐÐµÑ Ñакого Ñайла или каÑалога at
> test_e.pl line 9.
>
> Хочется иметь в логах правильные коды ошибок. Поэтому я попробовал
> поиграться со связыванием чтобы пофиксить этот баг целиком на проекте но не
> ходя по коду и не делая decode utf8 => $! на каждое место где встречается
> $!.
>
> соответственно вышеприведенный тест переписал к виду:
>
> =второй пример
>
> #!/usr/bin/perl
>
> use warnings;
> use strict;
>
> use utf8;
> use open qw(:std :utf8);
>
> package FixErrno;
>
> use base qw(Tie::Scalar);
> use Encode qw(decode);
>
> sub TIESCALAR
> {
>     return bless \my $dummy;
> }
>
> sub FETCH
> {
>     print "FETCH\n";
>     return decode utf8 => ${ $_[0] };
> }
>
> sub STORE
> {
>     print "STORE\n";
>     ${ $_[0] } = $_[1];
> }
>
>
> tie $! => 'FixErrno';
>
> package main;
> use Encode qw(decode);
>
>
> open my $file, '<', 'abrakadabra/not-found'
>     or die "Ошибка открытия файла: $!";
>
> =конец второго примера
>
> соответственно  результат работы такой:
>
> =начало
>
> perl test_e.pl
> FETCH
> Ошибка открытия файла: ÐÐµÑ Ñакого Ñ
>                                          айла или каÑалога at
> test_e.pl line 38.
> =конец
>
> то есть FETCH вызывается, а STORE не вызывается. А поскольку STORE не
> вызывается, то и все это не работает.
> Есть идеи что можно простого сделать с проектом у которого много $! но не
> хочется расставлять decode повсюду?



-- 
Vladimir Perepelitsa aka Mons Anderson
<inthrax на gmail.com> / #99779956


Подробная информация о списке рассылки Moscow-pm