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

%hash mit @arrays als value: unique-Ausgabe der arrays



<< >> 7 Einträge, 1 Seite
Duff
 2007-01-29 16:33
#73807 #73807
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Hallo,

ich habe folgendes Problem.
Ich habe einen Hash, dessen Schlüssel auf ein Array zeigt.
Ich möchte nun den Schlüssel und das dazugehörige Array ausgeben. Aus dem Array möchte ich aber doppelte Einträge nicht ausgeben, sondern nur ein "unique".

Ausserdem möchte ich Fehler wie
Code: (dl )
Use of uninitialized value in join or string at
nicht mit ausgeben.

Komme nicht wirklich weiter.
Habe es bisher so versucht:
Code: (dl )
1
2
3
4
        for my $k (sort keys %hash) {
print "$k => @{$hash{$k}}\n"; # gibt alles aus, aber doppelt und mit oberer Fehlermeldung
print "$k => $hash{$k}\n"; # gibt Schlüssel mit Arrayreferenz aus
}


Danke.\n\n

<!--EDIT|Duff|1170081227-->
D'OH
Daniel
renee
 2007-01-29 16:37
#73808 #73808
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
        for my $k (sort keys %hash) {
# Hash für "unique'ness
my %unique;
# Hashslice
@unique{grep{defined $_}@{$hash{$k}} = undef;
print $k," => ",join(" - ",keys(%unique)),"\n";
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Duff
 2007-01-29 16:46
#73809 #73809
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Danke für die super schnelle Antwort.

Aber ich will das ja in Zukunft auch mal selber schnell lösen können.
Kannst du mir eventuell in ein paar Zeilen erklären, was du genau gemacht hast bzw. was es bedeutet.

Wäre echt super.
Danke.
D'OH
Daniel
renee
 2007-01-29 16:57
#73810 #73810
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich nutze die Eigenschaft des Hashes, immer eindeutige Schlüssel zu haben. Wenn ich also aus nem Array, alles nur einmal drinhaben, nehme ich die Werte des Arrays als Schlüssel des Hashes.

Dann spare ich mir Arbeit und nutze keine Schleife, um den Hash zu füllen, sondern nutze die tolle Sache "Hashslice".

Das kann man sich ungefähr so vorstellen: Du stehst vor einem Bücherregal und willst die Bücher 'Perl-Kochbuch', 'Best of $foo-Magazin' und 'Algorithmen mit Perl' herausholen. Das ist Deine Liste...

Jetzt hast Du zwei Möglichkeiten: Du kannst zum Einen alle drei Bücher auf einmal herausholen, oder Du gehst die Liste durch und holst immer nur ein Buch.

Ok, in diesem Realbeispiel funktioniert es nur, wenn die Bücher direkt nebeneinander stehen, sonst holst Du zu viel raus, aber der Hash kann das auch so ;)

Und das join verbindet die Elemente einer Liste mit einem String. Hier steht zwischen den einzelnen Elementen der Liste (hier: des Arrays) ein -.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Duff
 2007-01-29 17:46
#73811 #73811
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Danke.
Mir geht es auch eigentlich um die Zeile
Code: (dl )
@unique{grep{defined $_}@{$hash{$k}} = undef;


Ok, ich grep in dem Hash bzw. in dem Array des Hashes nach einer definierten Variable, und speichere sie im Array @unique.

Aber wieso setze ich das nun = undef?
D'OH
Daniel
renee
 2007-01-29 18:45
#73812 #73812
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Man braucht ja keine wirklichen Werte. Es geht ja nur darum, dass der Schlüssel mal im Hash vorhanden ist...

Du speicherst es nicht im Array @uniqe, sondern im Hash %unique und verwendest dazu den Hashslice.

http://web.dadanini.com:7980/books/Perl_in_21Tagen/Kap08.html
http://wiki.preshweb.co.uk/doku.php?id=perl:hashslice
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Duff
 2007-01-29 20:31
#73813 #73813
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Ok, danke.

Werde mir das Thema wohl noch mal durchlesen müssen...
D'OH
Daniel
<< >> 7 Einträge, 1 Seite



View all threads created 2007-01-29 16:33.