为什么我要使用Devel :: Peek ::转发两个不同的结果?
#!/usr/bin/env perl
use warnings;
use 5.014;
use utf8;
binmode STDOUT, ':encoding(utf-8)';
use Devel::Peek;
my %hash1 = ( 'müller' => 1 );
say Dump $_ for keys %hash1;
my %hash2;
$hash2{'müller'} = 1;
say Dump $_ for keys %hash2;
输出:
SV = PV(0x753270) at 0x76d230
REFCNT = 2
FLAGS = (POK,pPOK,UTF8)
PV = 0x759750 "m\303\274ller"\0 [UTF8 "m\x{fc}ller"]
CUR = 7
LEN = 8
SV = PV(0x753270) at 0x7d75a8
REFCNT = 2
FLAGS = (POK,FAKE,READONLY,pPOK)
PV = 0x799110 "m\374ller"
CUR = 6
LEN = 0
答案 0 :(得分:4)
这两个标量都包含完全相同的字符串。唯一的区别仅在于如何在内部存储字符串。
我的猜测是,关键是规范化的,以便在尝试在哈希中找到密钥时更容易进行比较。
答案 1 :(得分:1)
这不是答案,我相信池上的回应是正确的。我只是想用一些代码添加一些观察结果。
我将以下代码通过5.10运行到5.15,行为是一致的。
use utf8;
use Test::More;
{
my %h = ('müller' => 1);
my $k = (keys %h)[0];
ok(utf8::is_utf8($k), 'UTF-8 Latin-1 hash key has SvUTF8 set');
}
{
my %h = ('müller' => 1);
$h{'müller'} = 2;
my $k = (keys %h)[0];
ok( ! utf8::is_utf8($k), 'UTF-8 Latin-1 hash key does not has SvUTF8 set after assignment');
}
{
my %h = ('☺' => 1);
$h{'☺'} = 2;
my $k = (keys %h)[0];
ok(utf8::is_utf8($k), 'UTF-8 (> Latin-1) hash key has SvUTF8 set after assignment');
}
done_testing;
如果预期第二次测试,那将是我所知道的第一次无声降级。我猜p5p的最终答案是否是优化错误或预期行为。 (sv_dump看起来像一个优化(POK,FAKE,READONLY,pPOK))