[Vienna-pm] utf8 string als hash-key

max prozessor13 at gmx.net
Mon Sep 21 03:00:12 PDT 2009


bins schonwieder.

> Dazu gibt es auch einen vorgesehenen Weg:
>
>       ·   utf8::encode($string)

ok. das hab ich jetzt verwendet, und unter perl 5.8.9 funkt das auch  
(wie auch schon das _utf8_off/on)

aber leider gehts immer noch nicht, und ich hab noch folgendes  
rausgefunden:

die TokyoTyrant mget methode macht definitv was komisches:

sub x {
    my %hash = map { $_ => 'ko' } @_;
    print "1: " . join(",", keys %hash) . "\n";
    $rdb->mget(\%hash);
    print "2: " . join(",", keys %hash) . "\n";
    foreach (keys %hash) {
       my $k = $_;
       utf8::decode($k);
       $hash{$k} = $hash{$_};
    }
    print "3: " . join(",", keys %hash) . "\n";
    return \%hash;
}

liefert die ausgabe in perl 5.8.9:

1: öäü
2: öäü
3: öäü,öäü

soweit sogut, mget macht was mit dem hash, aber man kann es  
reparieren, aber:

unter 5.10 bleibt die methode mget haengen. d.h. ich muss ein  
utf8::encode dranmachen.

    my %hash = map { $_ => 'ko' } @_;

wird zu

    my %hash = map { utf8::encode($_); $_ => 'ko' } @_;

der output ist:

1: öäü
2: öäü
3: öäü,öäü

schaut auch richtig aus.. aber jetzt kommts: wenn ich sowas schreib

    my %hash = map { my $k = $_;utf8::encode($k); $k => 'ko' } @_;

dann kommt zwar der gleiche output, aber die HASH->FETCH methode  
liefert nix mehr:

d.h. ich bau:

    foreach my $k (keys %hash) {
       print "k: $k -> $hash{$k}\n";
    }

irgendwo ein und bekomm:

k: öäü ->
k: öäü -> ok

obwohl Data::Dumper:

$VAR1 = {
           "\x{f6}\x{e4}\x{fc}" => 'ok',
           'öäü' => 'ok'
         };

liefert. also fuer mich ist das eindeutig ein perl5.10 bug!!

lg.





More information about the Vienna-pm mailing list