[Moscow.pm] tie на стандартные переменные
Ivan Petrov
i.petro.77.00 на gmail.com
Вс Янв 23 02:39:14 PST 2011
У Ларри Уолла есть пример когда используя 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 повсюду?
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20110123/1194c422/attachment.html>
Подробная информация о списке рассылки Moscow-pm