[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 было извлечено&hellip;
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20110123/1194c422/attachment.html>


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