【问题标题】:Hash keys encoding: Why do I get here with Devel::Peek::Dump two different results?哈希键编码:为什么我会使用 Devel::Peek::Dump 得到两个不同的结果?
【发布时间】:2012-01-15 03:38:57
【问题描述】:

为什么我会在这里使用 Devel::Peek::Dump 两个不同的结果?

#!/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

【问题讨论】:

  • 你确定你的源对两个键都有完全相同的字节吗?
  • 对我来说同样的事情:我的输出和你完全一样。从浏览器复制代码或自己输入变音符号会得到相同的结果。尽管如此,两个哈希之间的比较仍然有效:say 'Found!' if exists $hash2{ (keys %hash1)[0] }; # outputs 'Found!'
  • ü 都是用键盘上的 ü 键编写的。
  • 顺便说一句,say Dump ...; 应该是 Dump ...;
  • 在此处打开 stackoverflow.com/questions/8443863/… 相关问题。

标签: perl encoding hash key


【解决方案1】:

这两个标量包含完全相同的字符串。唯一的区别仅在于字符串在内部的存储方式。

我的猜测是,在尝试在散列中定位键时,键被规范化以使比较更容易。

【讨论】:

  • 我试图用 XML::LibXML 从哈希中写入一个 xml 文件。当我在$hash{key}... 模式下编写哈希条目时,我收到错误消息并且脚本死了:
    @sid_com,这里不是问新问题的地方,而且你的问题非常不清楚。请将其发布在适当的位置,并提供一个最小的、可运行的问题演示。
  • 打开了一个新问题:stackoverflow.com/questions/8443863/…
  • @sid_com,谢谢,这更容易回答。
【解决方案2】:

这不是答案,我相信 ikegami 的回答是正确的。我只是想用一些代码添加一些观察结果。

我从 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))

【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多
    热门标签