Строковая перегрузка и флаг utf8

Я чего-то не понимаю в перегрузке строк и в том, как она взаимодействует с флагом utf8.

Например, печатается следующий код:

n is utf8 at ./test_stringify_utf8.pl line 46.
$t->{name} is utf8 at ./test_stringify_utf8.pl line 47.
t is not utf8 at ./test_stringify_utf8.pl line 48.
Derviş
t is utf8 at ./test_stringify_utf8.pl line 50.

Если я удалю say $t, последняя строка вывода также будет t is not utf8

#!/usr/bin/env perl

use utf8;
use Encode qw/is_utf8/;
use strict;

use Modern::Perl '2013';

package Test;
use strict;

sub new {
    my ($class, $name) = @_;

    my $self = { name => $name };
    bless $self, $class;

    return $self;
}

BEGIN {
    my %OVERLOADS = (fallback => 1);

    $OVERLOADS{'""'} = 'to_string';

    use overload;
    overload->import(%OVERLOADS);
}

sub to_string { shift->{name} }


package main;

my $n = "Derviş";
my $t = Test->new($n);

binmode STDOUT, ":utf8";

is_utf8($n)         ? warn "n is utf8"          : warn "n is not utf8";
is_utf8($t->{name}) ? warn '$t->{name} is utf8' : warn '$t->{name} is not utf8';
is_utf8($t)         ? warn "t is utf8"          : warn "t is not utf8";
say $t;
is_utf8($t) ? warn "t is utf8" : warn "t is not utf8";

person jira    schedule 30.04.2013    source источник


Ответы (1)


Перегруженная строковая классификация может возвращать разные строки при каждом вызове, поэтому вы пытаетесь найти формат хранения строки, которой еще даже не существует. Когда вы преобразуете объект в строку, флаг UTF8 ссылки обновляется, чтобы отразить UTF8 строкового объекта.

"".$t также будет работать там, где вы использовали say $t;.

person ikegami    schedule 30.04.2013