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

Vladimir Timofeev vovkasm на gmail.com
Ср Янв 26 02:37:11 PST 2011


2011/1/25 Mons Anderson <inthrax на gmail.com>:
> вариант, позволяющий избежать данной проблемы:
>
> 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;
>
А вот это не очень хорошо. Т.к. не будет работать для чего-то кроме
UTF-8... т.е. случайно LANG=ru_RU.KOI8-R и любой модуль с "use utf8"
окажется сломанным.

>
> 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 mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>



-- 
Vladimir Timofeev <vovkasm на gmail.com>


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