utf-8 Zeichen als hash-key

Hallo,

ich versuche, UTF-8-Zeichen als hash-key zu benutzen, was offenbar nicht
geht. Meine Idee war nun, das UTF-8-Zeichen in eine Nummernfolge o.ä.
umzusetzen und diese als key zu verwenden, leider habe ich dazu nichts
gefunden. Hat jemand eine Idee?

Danke,

Christoph
Christoph Krempe [ Fr, 11 Januar 2008 15:27 ] [ ID #1905809 ]

Re: utf-8 Zeichen als hash-key

Christoph Krempe wrote:

> Hallo,
>
> ich versuche, UTF-8-Zeichen als hash-key zu benutzen, was offenbar nicht
> geht.

Warum sollte das nicht gehen? Was für einen Fehler bekommst Du?

> Meine Idee war nun, das UTF-8-Zeichen in eine Nummernfolge o.ä.
> umzusetzen und diese als key zu verwenden, leider habe ich dazu nichts
> gefunden. Hat jemand eine Idee?

ord();

Gruß,
Ekki
df4or [ Fr, 11 Januar 2008 15:39 ] [ ID #1905810 ]

Re: utf-8 Zeichen als hash-key

Am Fri, 11 Jan 2008 15:39:05 +0100 schrieb Ekki Plicht (DF4OR):

> Christoph Krempe wrote:
>
>> Hallo,
>>
>> ich versuche, UTF-8-Zeichen als hash-key zu benutzen, was offenbar
>> nicht geht.
>
> Warum sollte das nicht gehen? Was für einen Fehler bekommst Du?
>
>> Meine Idee war nun, das UTF-8-Zeichen in eine Nummernfolge o.ä.
>> umzusetzen und diese als key zu verwenden, leider habe ich dazu nichts
>> gefunden. Hat jemand eine Idee?
>
> ord();
>
> Gruß,
> Ekki

So wird der hash gefüllt:

$u="Ł";
$utftable['$u'] = "l";

$x=$utftable[Ł];

print "$x\n";

gibt mir aus:
Unrecognized character \xC5


$x=$utftable['Ł'];
gibt mir aus: 0
Christoph Krempe [ Fr, 11 Januar 2008 15:57 ] [ ID #1905811 ]

Re: utf-8 Zeichen als hash-key

Christoph Krempe schrieb:
> Am Fri, 11 Jan 2008 15:39:05 +0100 schrieb Ekki Plicht (DF4OR):
>>
>>> Meine Idee war nun, das UTF-8-Zeichen in eine Nummernfolge o.ä.
>>> umzusetzen und diese als key zu verwenden, leider habe ich dazu nichts
>>> gefunden. Hat jemand eine Idee?
>
> So wird der hash gefüllt:
>
> $u="Ł";
> $utftable['$u'] = "l";
>
> $x=$utftable[Ł];
>
> print "$x\n";
>
> gibt mir aus:
> Unrecognized character \xC5
>
>
> $x=$utftable['Ł'];
> gibt mir aus: 0

Das ist kein perl, was Du das schreibst. Perl benutzt
geschweifte Klammern um Hashelemente zu adressieren
und interpoliert keine Variablen in einfachen Hochkomma.

----------------------------------------------------
#!/usr/bin/perl

use strict;
use warnings;
use utf8;

my %utftable;

my $u="Ł";
$utftable{$u} = "l"; # auch $utftable{"$u"} = "l"; geht

my $x = $utftable{"Ł"};

print "$x\n";
-----------------------------------------------------

Funktioniert problemlos.

-Christian
Christian Winter [ Fr, 11 Januar 2008 17:04 ] [ ID #1905812 ]

Re: utf-8 Zeichen als hash-key

Am Fri, 11 Jan 2008 14:57:21 +0000 schrieb Christoph Krempe:

> Am Fri, 11 Jan 2008 15:39:05 +0100 schrieb Ekki Plicht (DF4OR):
>
>> Christoph Krempe wrote:
>>
>>> Hallo,
>>>
>>> ich versuche, UTF-8-Zeichen als hash-key zu benutzen, was offenbar
>>> nicht geht.
>>
>> Warum sollte das nicht gehen? Was für einen Fehler bekommst Du?
>>
>>> Meine Idee war nun, das UTF-8-Zeichen in eine Nummernfolge o.ä.
>>> umzusetzen und diese als key zu verwenden, leider habe ich dazu nichts
>>> gefunden. Hat jemand eine Idee?
>>
>> ord();
>>
>> Gruß,
>> Ekki
>
> So wird der hash gefüllt:
>
> $u="Ł";
> $utftable['$u'] = "l";
>
> $x=$utftable[Ł];
>
> print "$x\n";
>
> gibt mir aus:
> Unrecognized character \xC5
>
>
> $x=$utftable['Ł'];
> gibt mir aus: 0

War mein Fehler, ich hatte ein chomp falsch gesetzt, und den hash mit "["
statt "{" definiert ...

Christoph
Christoph Krempe [ Fr, 11 Januar 2008 17:05 ] [ ID #1905813 ]

Re: utf-8 Zeichen als hash-key

Christoph Krempe:

> So wird der hash gefllt:
>
> $u="L";
> $utftable['$u'] = "l";

Ja, in PHP vielleicht. In Perl solltest du

$utftable{"$u"} = 1;

schreiben, das wird sicher besser funktionieren.

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: ferdinand.bolhar-nordenkampf [at] wien.gv.at
Ferry Bolhar [ Fr, 11 Januar 2008 19:57 ] [ ID #1905814 ]

Re: utf-8 Zeichen als hash-key

Christoph Krempe wrote:

> So wird der hash gefüllt:
>
> $u="Ł";
> $utftable['$u'] = "l";
>
> $x=$utftable[Ł];
>
> print "$x\n";

Abgesehen vom Syntaxfehler willst Du vermutlich folgendes machen:

use strict;
use warnings;
use utf8;

use Text::Undiacritic qw(undiacritic);

$u = 'Ł';
$utftable{$u} = lc( undiacritic( $u ) );

Helmut Wollmersdorfer
Helmut Wollmersdorfer [ So, 13 Januar 2008 23:58 ] [ ID #1906895 ]

Re: utf-8 Zeichen als hash-key

Am Sun, 13 Jan 2008 23:58:05 +0100 schrieb Helmut Wollmersdorfer:

> Christoph Krempe wrote:
>
>> So wird der hash gefüllt:
>>
>> $u="Ł";
>> $utftable['$u'] = "l";
>>
>> $x=$utftable[Ł];
>>
>> print "$x\n";
>
> Abgesehen vom Syntaxfehler willst Du vermutlich folgendes machen:
>
> use strict;
> use warnings;
> use utf8;
>
> use Text::Undiacritic qw(undiacritic);
>
> $u = 'Ł';
> $utftable{$u} = lc( undiacritic( $u ) );
>
> Helmut Wollmersdorfer

Genau!! Das Modul hat mir gefehlt, besten Dank!

Leider bekomme ich bei der Umsetzung meiner Daten folgende Fehler:

Use of uninitialized value in chr at /usr/perl5/site_perl/5.8.4/Text/
Undiacritic.pm line 28, <ALG> line 444.
Use of uninitialized value in substitution (s///) at /usr/perl5/
site_perl/5.8.4/Text/Undiacritic.pm line 27, <ALG> line 453.
Use of uninitialized value in pattern match (m//) at /usr/perl5/5.8.4/lib/
charnames.pm line 303, <ALG> line 453.
Use of uninitialized value in exists at /usr/perl5/5.8.4/lib/charnames.pm
line 305, <ALG> line 453.
Use of uninitialized value in concatenation (.) or string at /usr/
perl5/5.8.4/lib/charnames.pm line 309, <ALG> line 453.
Use of uninitialized value in chr at /usr/perl5/site_perl/5.8.4/Text/
Undiacritic.pm line 28, <ALG> line 453.
Use of uninitialized value in substitution (s///) at /usr/perl5/
site_perl/5.8.4/Text/Undiacritic.pm line 27, <ALG> line 490.
Use of uninitialized value in pattern match (m//) at /usr/perl5/5.8.4/lib/
charnames.pm line 303, <ALG> line 490.
Use of uninitialized value in exists at /usr/perl5/5.8.4/lib/charnames.pm
line 305, <ALG> line 490.
Use of uninitialized value in concatenation (.) or string at /usr/
perl5/5.8.4/lib/charnames.pm line 309, <ALG> line 490.
Use of uninitialized value in chr at /usr/perl5/site_perl/5.8.4/Text/
Undiacritic.pm line 28, <ALG> line 490.

Ich vermute, das hängt mit der Art meiner Eingabedaten zusammen, sie
bestehen u.a. aus \x00 und \x01-Zeichen, sind also keine reinen UTF8-
Daten. Ich will einfach die Eingabedatei Satz für Satz auf das vorkommen
von UTF-8-Zeichen prüfen und jeweils den Grundbuchstaben zurückgeben.

Ein anderes Problem ist, daß der split in meinem Progrämchen offenbar
byteweise, nicht zeichenweise arbeitet:

use strict;
use warnings;
use utf8;
use Text::Undiacritic qw(undiacritic);


while(<ALG>){
my $kopf="";
my $zeichen="";
my [at] satz = split(/ [at] [at] [at] /, $_); # nur den Teil bis " [at] [at] [at] "
my [at] ssatz = split(//,$satz[0]);
foreach $zeichen ( [at] ssatz) {
$s = lc(undiacritic($zeichen));
$kopf .= $zeichen;
}
print $kopf$satz[1]; # Kopf + Rest d. Satzes
}


Ein "print "$zeichen\n"; _vor_ dem undiacritic bringt im Fall von "ö"
zwei Zeichen statt "ö".
Christoph Krempe [ Mo, 14 Januar 2008 10:38 ] [ ID #1907791 ]

Re: utf-8 Zeichen als hash-key

Am Mon, 14 Jan 2008 09:38:10 +0000 schrieb Christoph Krempe:

> Am Sun, 13 Jan 2008 23:58:05 +0100 schrieb Helmut Wollmersdorfer:
>
>> Christoph Krempe wrote:
>>
>>> So wird der hash gefüllt:
>>>
>>> $u="Ł";
>>> $utftable['$u'] = "l";
>>>
>>> $x=$utftable[Ł];
>>>
>>> print "$x\n";
>>
>> Abgesehen vom Syntaxfehler willst Du vermutlich folgendes machen:
>>
>> use strict;
>> use warnings;
>> use utf8;
>>
>> use Text::Undiacritic qw(undiacritic);
>>
>> $u = 'Ł';
>> $utftable{$u} = lc( undiacritic( $u ) );
>>
>> Helmut Wollmersdorfer
>
> Genau!! Das Modul hat mir gefehlt, besten Dank!
>
> Leider bekomme ich bei der Umsetzung meiner Daten folgende Fehler:
>
> Use of uninitialized value in chr at /usr/perl5/site_perl/5.8.4/Text/
> Undiacritic.pm line 28, <ALG> line 444. Use of uninitialized value in
> substitution (s///) at /usr/perl5/ site_perl/5.8.4/Text/Undiacritic.pm
> line 27, <ALG> line 453. Use of uninitialized value in pattern match
> (m//) at /usr/perl5/5.8.4/lib/ charnames.pm line 303, <ALG> line 453.
> Use of uninitialized value in exists at
> /usr/perl5/5.8.4/lib/charnames.pm line 305, <ALG> line 453.
> Use of uninitialized value in concatenation (.) or string at /usr/
> perl5/5.8.4/lib/charnames.pm line 309, <ALG> line 453. Use of
> uninitialized value in chr at /usr/perl5/site_perl/5.8.4/Text/
> Undiacritic.pm line 28, <ALG> line 453. Use of uninitialized value in
> substitution (s///) at /usr/perl5/ site_perl/5.8.4/Text/Undiacritic.pm
> line 27, <ALG> line 490. Use of uninitialized value in pattern match
> (m//) at /usr/perl5/5.8.4/lib/ charnames.pm line 303, <ALG> line 490.
> Use of uninitialized value in exists at
> /usr/perl5/5.8.4/lib/charnames.pm line 305, <ALG> line 490.
> Use of uninitialized value in concatenation (.) or string at /usr/
> perl5/5.8.4/lib/charnames.pm line 309, <ALG> line 490. Use of
> uninitialized value in chr at /usr/perl5/site_perl/5.8.4/Text/
> Undiacritic.pm line 28, <ALG> line 490.
>
> Ich vermute, das hängt mit der Art meiner Eingabedaten zusammen, sie
> bestehen u.a. aus \x00 und \x01-Zeichen, sind also keine reinen UTF8-
> Daten. Ich will einfach die Eingabedatei Satz für Satz auf das vorkommen
> von UTF-8-Zeichen prüfen und jeweils den Grundbuchstaben zurückgeben.
>
> Ein anderes Problem ist, daß der split in meinem Progrämchen offenbar
> byteweise, nicht zeichenweise arbeitet:
>
> use strict;
> use warnings;
> use utf8;
> use Text::Undiacritic qw(undiacritic);
>
>
> while(<ALG>){
> my $kopf="";
> my $zeichen="";
> my [at] satz = split(/ [at] [at] [at] /, $_); # nur den Teil bis " [at] [at] [at] "
> my [at] ssatz = split(//,$satz[0]);
> foreach $zeichen ( [at] ssatz) {
> $s = lc(undiacritic($zeichen));
> $kopf .= $zeichen;
> }
> print $kopf$satz[1]; # Kopf + Rest d. Satzes
> }
>
>
> Ein "print "$zeichen\n"; _vor_ dem undiacritic bringt im Fall von "ö"
> zwei Zeichen statt "ö".

Das Problem liegt woanders: Unter Linux (32bit) funktioniert
split(//,$string) wie erwartet, unter Solaris10 (64bit) nicht ...

Danke für die Hinweise!

Christoph
Christoph Krempe [ Mo, 14 Januar 2008 14:07 ] [ ID #1907795 ]

Re: utf-8 Zeichen als hash-key

On 2008-01-14 09:38, Christoph Krempe <krempe [at] ub.fu-berlin.de> wrote:
> Ich vermute, das hngt mit der Art meiner Eingabedaten zusammen, sie
> bestehen u.a. aus \x00 und \x01-Zeichen, sind also keine reinen UTF8-
> Daten.

Was ist an \x00 und \x01 nicht UTF-8?

> Ich will einfach die Eingabedatei Satz fr Satz auf das vorkommen
> von UTF-8-Zeichen prfen und jeweils den Grundbuchstaben zurckgeben.
>
> Ein anderes Problem ist, da der split in meinem Progrmchen offenbar
> byteweise, nicht zeichenweise arbeitet:

split arbeitet mit dem was es bekommt: Wenn Du einen Character-String
splittest, arbeitet es zeichenweise, wenn Du einen Bytestring splittest,
(natrlich) byteweise.

Also ...

> use strict;
> use warnings;
> use utf8;
> use Text::Undiacritic qw(undiacritic);
>
>
> while(<ALG>){
> my $kopf="";
> my $zeichen="";
> my [at] satz = split(/ [at] [at] [at] /, $_); # nur den Teil bis " [at] [at] [at] "

.... ist hier vermutlich $_ ein Bytestring.

Wo kommt $_ her? Es wird ein paar Zeilen vorher von ALG gelesen.

Wie wurde ALG geffnet? Das hast Du uns nicht mitgeteilt.

hp

PS: Folgende Routine ist gelegentlich recht praktisch:

sub dumpstr {
my ($s) = [at] _;

print utf8::is_utf8($s) ? "char" : "byte";
print ":";
for (split //, $s) {
printf " %#02x", ord($_);
}
print "\n";
}
hjp-usenet2 [ Di, 15 Januar 2008 19:55 ] [ ID #1908831 ]
Perl » de.comp.lang.perl.misc » utf-8 Zeichen als hash-key

Vorheriges Thema: anf_frage: Variablen-Interpolation in RegEx
Nächstes Thema: Liste aus Funktion zurückgeben