2011-12-07 9 views
12

Neden buraya Devel :: Peek :: Dump iki farklı sonuçla geliyor? Karma anahtar kodlaması: Neden buraya Devel :: Peek :: ile iki farklı sonuç getirebilirim?

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

Çıktı

:

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

Kaynağın her iki tuş için de tam olarak aynı bayt olduğundan emin misiniz? – Mat

+0

her ikisi de 'ü 'keyboad'dan' ü' ile yazılır. –

+0

btw, 'Dump…;' Dump…; 'olmalıdır. – ikegami

cevap

4

bu skalerler her ikisi de aynı dizeyi içerir. Tek fark, yalnızca dizenin dahili olarak nasıl depolandığıdır.

Tahminimce, anahtar, karma içinde yerini bulmaya çalışırken karşılaştırmaları kolaylaştırmak için anahtarın normalleştirilmesidir.

+0

Bir 'xml' dosyasını bir hashtan 'XML :: LibXML' ile yazmaya çalıştım. "$ Hash {key} ..." modunda karma girişleri yazdığımda hata iletileri alıyorum ve komut dosyası ölüyor: kodlayıcı hatası

+0

@sid_com , Bu yeni soru sormak için bir yer değil ve sorunuzu son derece belirsizdir.Lütfen uygun bir yere gönderin ve sorunun minimal, gösterilebilir bir gösterimini sağlayın. – ikegami

+0

Yeni bir soru açtı: http://stackoverflow.com/questions/8443863/getting-encoding-error-when-using-hash-tuşları-yazma-xml-dosyaları-xmllibxml ile –

1

Bu bir cevap değil, ikegami yanıtının doğru olduğuna inanıyorum. Sadece bazı kodlarla bazı gözlemler eklemek istedim.

Aşağıdaki kodu 5.10 ile 5.15 arasında yürüttüm ve davranış tutarlı.

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; 

İkinci sınama beklenirse, bildiğim ilk sessiz düşüş olur. Sanırım p5p, bunun bir optimizasyon hatası mı yoksa beklenen davranış mı olduğu konusunda kesin bir cevabı var. (sv_dump bir optimizasyona benziyor (POK, FAKE, READONLY, pPOK))

İlgili konular