Komische Hash Benutzung

Komische Hash Benutzung

am 01.08.2006 19:55:58 von Alexander Fieger

Hallo,
ich habe folgende Hashbenutzung in einem Programm.

$TEST{$var1, $var2, $var3} = 'blub';
print $TEST{$var1, $var2, $var3};

Ich konnte dazu nirgends Informationen finden.
Kann / Sollte man sowas benutzen?

Re: Komische Hash Benutzung

am 01.08.2006 22:43:27 von Christian Garbs

Mahlzeit!

Alexander Fieger wrote:

> ich habe folgende Hashbenutzung in einem Programm.
>
> $TEST{$var1, $var2, $var3} = 'blub';
> print $TEST{$var1, $var2, $var3};
>
> Ich konnte dazu nirgends Informationen finden.
> Kann / Sollte man sowas benutzen?

Das sieht für mich nach einem mehrdimensionalen Schlüssel aus. Ich
finde leider keine Doku dazu, aber die Teilschlüssel werden einfach
aneinandergepackt. Beispiel:

my %foo;
$foo{'A', 'C'} = "ac";
$foo{'A', 'D'} = "ad";
print join(' ', keys %foo)."\n";

ergibt

AC AD

Wenn also keine Verwechslungsgefahr der Teilschlüssel besteht, kannst
Du so arbeiten. Andernfalls solltest Du geeignete Trennzeichen
zwischen die Schlüssel packen.

Gruß,
Christian
--
sub _{print"\n"}_;for(;$s<9;++$s){$_='1E2018201E00001E2018201E00001E2018201'
..'E002020001C2222221400005CA2A2A27C02001C2222221C20003E0402 02201F2422221C00'
..'242A2A2A12002020001C2222221F20001C2A2A2A0C';while(s;(..); ;){printf'%c',hex
$1&1<<$s?40:32}_}$_=':::Christian Garbs:',y;:;\t;;print;_;_

Re: Komische Hash Benutzung

am 02.08.2006 11:57:02 von Mirko Westermeier

Christian Garbs schrieb:

>>$TEST{$var1, $var2, $var3} = 'blub';
>>print $TEST{$var1, $var2, $var3};
>>
>>Kann / Sollte man sowas benutzen?
>
> Das sieht für mich nach einem mehrdimensionalen Schlüssel aus. Ich
> finde leider keine Doku dazu, aber die Teilschlüssel werden einfach
> aneinandergepackt. Beispiel:
>
> my %foo;
> $foo{'A', 'C'} = "ac";
> $foo{'A', 'D'} = "ad";
> print join(' ', keys %foo)."\n";
>
> ergibt
>
> AC AD

Ja. Aber warum? $hash{context()} wertet context() im skalaren Kontext
aus, aber wenn man da, wie hier, ein Listenliteral reinsteckt, passiert
diese Konkatenation:

$ perl -le 'sub context { print wantarray? q(LIST) : q(SCALAR) }
my %hash; $hash{context()}'
SCALAR

$ perl -le 'print scalar qw(foo bar)'
bar

$ perl -le 'my %hash; $hash{ qw(foo bar) } = q(baz);
print qq($_ => $hash{$_}) for keys %hash;'
foobar => baz

Hier hätte ich jetzt bar => baz erwartet. Ich bin gern bereit, das als
syntaktischen Zucker zu akzeptieren, mir fällt aber kein Beispiel ein,
wo das von Nutzen wäre. Wie ist das motiviert bzw. wo liegt mein Denkfehler?

Mit freundlichem Gruß
Mirko 'Columbus' Westermeier

--
Entschäumungsbeauftragter und Wurstrechtvertreter zu detebe
E-Mail: , OpenPGP-Key-ID: 0x730E195D
Key fingerprint: 55A8 9646 9B58 60AC B5BC 9661 FDD4 93C0 730E 195D
E-Mails von mir sind signiert. Unsignierte E-Mails sind nicht von mir.

Re: Komische Hash Benutzung

am 03.08.2006 03:17:27 von Maluku

Mirko 'Columbus' Westermeier schrieb:
> Christian Garbs schrieb:
>
>
>>>$TEST{$var1, $var2, $var3} = 'blub';
>>>print $TEST{$var1, $var2, $var3};

>> my %foo;
>> $foo{'A', 'C'} = "ac";
>> $foo{'A', 'D'} = "ad";
>> print join(' ', keys %foo)."\n";

> Ja. Aber warum? $hash{context()} wertet context() im skalaren Kontext
> aus, aber wenn man da, wie hier, ein Listenliteral reinsteckt, passiert
> diese Konkatenation:
>
> $ perl -le 'sub context { print wantarray? q(LIST) : q(SCALAR) }
> my %hash; $hash{context()}'
> SCALAR
>
> $ perl -le 'print scalar qw(foo bar)'
> bar
>
> $ perl -le 'my %hash; $hash{ qw(foo bar) } = q(baz);
> print qq($_ => $hash{$_}) for keys %hash;'
> foobar => baz
>
> Hier hätte ich jetzt bar => baz erwartet. Ich bin gern bereit, das als
> syntaktischen Zucker zu akzeptieren, mir fällt aber kein Beispiel ein,
> wo das von Nutzen wäre. Wie ist das motiviert bzw. wo liegt mein Denkfehler?

Das ist glaube ich eine alte Version eines mehrdimensionaler Hashes,
stand irgendwo in meiner Kurzreferenz zu 5.8.0 (daneben steht: deprecated)

--
$_='';s%%`^.*`s;.*;uhtnmo;;a>lha~a>inu~a>fmk~a>rou~a>duM~a>b tl~s;&&&&&&;
!d1!l2!b3!i4!f5!r6q(?);e;Z``}a>&&&`sub# "1#{#"_=shift#;s^"2^"3#^;``;~`
return #"_#}``^!&&`"1(#""2)#\.`Z%x;s~Z~print~g;s/#/\\/g;
s/`(.)(.+?)`(.+?)`/s$1$2$1$3$1g\;/gsx;s;&;(.);g;y^"^$^;print ;

Re: Komische Hash Benutzung

am 06.08.2006 17:58:51 von hjp-usenet2

On Tue, 01 Aug 2006 22:43:27 +0200, Christian Garbs wrote:
> Alexander Fieger wrote:
>> ich habe folgende Hashbenutzung in einem Programm.
>>
>> $TEST{$var1, $var2, $var3} = 'blub';
>> print $TEST{$var1, $var2, $var3};
>>
>> Ich konnte dazu nirgends Informationen finden.
>> Kann / Sollte man sowas benutzen?

Ja/Nein ;-).


> Das sieht für mich nach einem mehrdimensionalen Schlüssel aus.

Ja. Im awk-Stil. Hat der Autor des Programms vor Perl vor über 10 Jahren
gelernt?

> Ich finde leider keine Doku dazu, aber die Teilschlüssel werden
> einfach aneinandergepackt. Beispiel:
>
> my %foo;
> $foo{'A', 'C'} = "ac";
> $foo{'A', 'D'} = "ad";
> print join(' ', keys %foo)."\n";
>
> ergibt
>
> AC AD

Du sitzt da einer optischen Täuschung auf.


> Wenn also keine Verwechslungsgefahr der Teilschlüssel besteht, kannst
> Du so arbeiten. Andernfalls solltest Du geeignete Trennzeichen
> zwischen die Schlüssel packen.

Da ist ein geeignetes Trennzeichen dazwischen, nämlich $; (per default
"\034" (ASCII FS (Field Separator))).

perldoc perlvar

hp

--
_ | Peter J. Holzer | > Wieso sollte man etwas erfinden was nicht
|_|_) | Sysadmin WSR | > ist?
| | | hjp@hjp.at | Was sonst wäre der Sinn des Erfindens?
__/ | http://www.hjp.at/ | -- P. Einstein u. V. Gringmuth in desd