Каков самый простой способ сделать предупреждения модулей фатальными?

С помощью «освоения perl» я перезаписал функцию «кодирование» модуля «Кодирование». Есть ли более короткий способ сделать фатальные предупреждения encode-utf8?

#!/usr/bin/env perl
use warnings;
use 5.012;
binmode STDOUT, ':encoding(utf-8)';
BEGIN {
    use Encode;
    no warnings 'redefine';
    *Encode::encode = sub ($$;$) {
        my ( $name, $string, $check ) = @_;
        return undef unless defined $string;
        $string .= '' if ref $string;
        $check ||= 0;
        unless ( defined $name ) {
            require Carp;
            Carp::croak("Encoding name should not be undef");
        }
        my $enc = find_encoding($name);
        unless ( defined $enc ) {
            require Carp;
            Carp::croak("Unknown encoding '$name'");
        }
        use warnings FATAL => 'utf8'; ###
        my $octets = $enc->encode( $string, $check );
        $_[1] = $string if $check and !ref $check and !( $check & LEAVE_SRC() );
        return $octets;
    }
}

use Encode qw(encode);
use warnings FATAL => 'utf8';

my $character;
{
    no warnings 'utf8';
    $character = "\x{ffff}";
#   $character = "\x{263a}";
}

my $utf32;
eval { $utf32 = encode( 'utf-32', $character ) };
if ( $@ ) { 
    ( my $error_message = $@ ) =~ s/\K\sin\ssubroutine.*$//;
    chomp $error_message; # where does the newline come from?
    say $error_message;
}
else {
    my @a = unpack( '(B8)*', $utf32 );
    printf "utf-32 encoded:\t%8s %8s %8s %8s  %8s %8s %8s %8s\n", @a;
}

подвопрос: откуда берется новая строка в $ error_message после s ///?


person sid_com    schedule 02.03.2011    source источник


Ответы (1)


Я не уверен, что понимаю ваш главный вопрос ... use warnings FATAL => 'utf8'; уже довольно короткий; Не думаю, что ты найдешь что-нибудь короче.

Что касается подзапроса, . в регулярном выражении по умолчанию будет соответствовать любому символу кроме новой строки, так что подстановка не удаляет последнюю новую строку:

$ perl -e '$foo = "foo bar baz\n"; $foo =~ s/bar.*$//; print $foo . "---\n";'

отпечатки

foo
---

Чтобы . соответствовал символам новой строки, добавьте к вашему регулярному выражению модификатор /s:

perl -e '$foo = "foo bar baz\n"; $foo =~ s/bar.*$//s; print $foo . "---\n";'

отпечатки

foo ---
person Dave Sherohman    schedule 02.03.2011
comment
Должен ли я перезаписывать функцию кодирования, чтобы предупреждения utf8 были фатальными? - person sid_com; 02.03.2011
comment
@sid_com: Да, если вы собираетесь сделать это через use warnings FATAL, потому что use warnings имеет лексическую область видимости и никогда не повлияет на код в другом файле. Однако вы можете начать с $SIG{__WARN__} = sub { die @_; };, а затем добавить условие, чтобы оно умирало только при ошибках UTF-8, но вам, вероятно, придется обнаруживать их, просматривая сообщение об ошибке, которое чревато драконами. - person Dave Sherohman; 02.03.2011