perl – 重载字符串化和utf8标志
发布时间:2020-12-16 06:17:40 所属栏目:大数据 来源:网络整理
导读:关于重载字符串以及它如何与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标志交互,我有些不明白的事情.
例如,以下代码打印: 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. 如果我删除说$t,最后一行输出也将是t不是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"; 解决方法
重载的字符串化可以在每次调用时返回不同的字符串,因此您正在尝试查找尚不存在的字符串的存储格式.对字符串进行字符串化时,将更新引用的UTF8标志以反映字符串化对象的UTF8.
“”.$t也会在你使用说$t;的地方工作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |