Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7071[/thread]

3 Hashes aus einem Hash erzeugen

Leser: 1


<< |< 1 2 >| >> 15 Einträge, 2 Seiten
cbxk1xg
 2005-06-23 00:25
#55686 #55686
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Hallo Freunde der Sonne,

ich stehe etwas auf dem Schlauch. Ich will eigentlich nur aus einem Hash, drei verschiedene machen. Dabei soll lediglich zwischen unterschiedlichen Keys aussortiert werden. Also, dass was bei dem HASH %PLU gemacht werden soll, soll später auch bei %PM und %UFI gemacht werden.

Es geht darum, daß ich einige Keys im Hash %INPUT habe, die mit "PLU_" anfangen. Nun will ich Keys mit diesem Muster in einen eigenen Hash übertragen. Und dies natürlich mit ihren entsprechenden Werten.

Leider bekomme ich beim Hash %PLU jetzt den Schlüssel und nicht den Wert zurück.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
my (%INPUT) = @_;
my %PM    = ();
my %UFI    = ();
my %PLU = ();
for my $key (sort keys %INPUT)
{
$PM{$key}    = $DATAINPUT{$key}    if $key =~ /^PM_(.*?)/;
$UFI{$key}    = $DATAINPUT{$key}    if $key =~ /^UFI_(.*?)/;

if ($key =~ /^PLU_(.*?)/) {
$key =~ s-^PLU_(.*?)-$1-;
$PLU{$key} = $key;
}

}
undef %INPUT;
kristian
 2005-06-23 00:58
#55687 #55687
User since
2005-04-14
684 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo
> Leider bekomme ich beim Hash %PLU jetzt den Schlüssel und nicht den Wert zurück.

Code: (dl )
$PLU{$key} = $key;

Liegt da ev. dein Fehler?

Gruß Kristian
cbxk1xg
 2005-06-23 01:29
#55688 #55688
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Ja, allerdings. Aber $DATAINPUT{$key} bringt mir auch nicht das, was ich erwarte.
pq
 2005-06-23 01:37
#55689 #55689
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
woher kommt denn %DATAINPUT? bitte immer strict benutzen (Wiki:use strict)
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
cbxk1xg
 2005-06-23 01:44
#55690 #55690
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Quote
woher kommt denn %DATAINPUT? bitte immer strict benutzen (Wiki: use strict)

Der Code ist nur ein Ausschnitt aus einer Sub. Use strict ist an. DATAINPUT wird als reiner Hash an diese Sub geschickt. Etwa so:
Code: (dl )
return &meineSub(%DATAINPUT);

Da man nur einen Hash auf diese Art übergeben kann, bleibt mir in diesem Fall nichts anderes übrig, als die Schlüssel entsprechend zu benennen und später wieder zu trennen. - Es sei denn, man kann drei Hashes in ein Array packen???

Die Frage ist nun, wie bekomme ich den Wert und nicht den Schlüssel?
Strat
 2005-06-23 11:30
#55691 #55691
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
drei hashes in ein array packen? das geht als Referenz recht einfach? @array = (\%hash1, \%hash2, \%hash3);
und rueckwaerts:
Code: (dl )
1
2
3
%hash1 = %{ $array[0] };
%hash2 = %{ $array[1] };
%hash3 = %{ $array[2] };

oder direkt damit arbeiten:
Code: (dl )
1
2
3
foreach my $key (sort keys %{ $array[1] }) {
print "$key => $array[1]->{$key}\n";
}
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Strat
 2005-06-23 11:33
#55692 #55692
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
alles, was mit PM_ beginnt, aus %INPUT herauszuziehen kannst du z.B. auch mit:
Code: (dl )
1
2
3
4
%hash =
map { $_, $INPUT{$_} } # schluessel/wertpaare zurueckgeben
grep { /^PM_/ } # gibt liste aller keys zurueck, die mit PM_ beginnen
keys %INPUT;

wenn du sie in %INPUT loeschen willst:
Code: (dl )
1
2
3
4
%hash =
map { $_, delete $INPUT{$_} } # schluessel/wertpaare zurueckgeben und in %INPUT loeschen
grep { /^PM_/ } # gibt liste aller keys zurueck, die mit PM_ beginnen
keys %INPUT;
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
cbxk1xg
 2005-06-23 12:14
#55693 #55693
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
> .... das geht als Referenz recht einfach?
Genau das habe ich gesucht. Danke!
pq
 2005-06-23 13:00
#55694 #55694
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=cbxk1xg,22.06.2005, 23:44]Der Code ist nur ein Ausschnitt aus einer Sub. Use strict ist an. DATAINPUT wird als reiner Hash an diese Sub geschickt. Etwa so:
Code: (dl )
return &meineSub(%DATAINPUT);
[/quote]
wozu schreibst du denn
&meineSub(%DATAINPUT);
...
my (%INPUT) = @_;

wenn du eh den %DATAINPUT-hash benutzt? merkwürdig. wenn du das
ganze einer subroutine als argument übergibst, solltest du das auch
benutzen.
benutzt du nun strict oder nicht?
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
cbxk1xg
 2005-06-23 13:13
#55695 #55695
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Das ist etwas komplizierter. Ich habe ein HOST-script und ein Plugin. Aus dem HOST-script wird eine Sub im Plugin aufgerufen. Etwa so: &meineSub(%Hash);

Da ich aber nicht einen Hash, sondern eigentlich drei als Argument übergeben will, ist das etwas schwieriger, da von Perl nur ein Hash als Argument akzeptiert wird. Also ist die Lösung als Array mit entsprechenden Referenz die einfachste und beste Lösung.

> benutzt du nun strict oder nicht?
Ja, wenn es notwendig ist. Aber nicht immer. In diesem Fall wäre das manchmal hinderlich, da ich einige globale Variablen brauche. Zum debuggen benutze ich aber immer Strict und Warnings und lese mir auch brav die Logfiles durch.

Use strict hätte aber in diesem Fall meine Denkblockade, oder besser mein fehlendes Wissen auch nicht gelöst.
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2005-06-23 00:25.