Schrift
[thread]12372[/thread]

Ist Hash in Array vorhanden?



<< |< 1 2 >| >> 16 Einträge, 2 Seiten
RalphFFM
 2008-08-18 13:49
#113639 #113639
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo, ich möchte testen, ob ein bestimmter Hash innerhalb eines Arrays von Hashes vorhanden ist.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl
use strict; use warnings;

my @move;
push @move,{"123" => "foo"};
push @move,{"234" => "bar"};
push @move,{"345" => "joo"};

if (grep { $_ = {'234' => 'bier'} } @move) {
        print "vorhanden\n";
} else {
        print "nicht vorhanden\n";
}

Als Ausgabe kommt immer 'vorhanden' heraus. Der grep-Ausdruck scheint falsch zu sein. Was mache ich falsch? Im voraus Danke für Hilfe.
LanX-
 2008-08-18 14:15
#113641 #113641
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
[s]du musst Hashrefs pushen nicht die Listenrepräsentation der Hashes. Konkret erzeugst du im Code ein eindimensionalöes 6-elementiges Array, das => ist nur ein fettes Komma. [/s]

In deinem grep benutzt du auch eine Zuweisung mit = wodurch der Ausdruck immer wahr wird (Zuweisung ist der Scalarwert eienr Liste =(AFAIR) letztes Listenelement)
Struppi
 2008-08-18 14:17
#113642 #113642
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Was möchtest du den genau Wissen? Ob der Key existiert oder er einen bestimmten Wert hat?
Dein code weist allen Elementen den gleichen Wert zu.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl
use strict; use warnings;
use Data::Dumper;

my @move;
push @move,{"123" => "foo"};
push @move,{"234" => "bar"};
push @move,{"345" => "joo"};

if (grep { $_ = {'234' => 'bier'} } @move) {
         print "vorhanden\n";
} else {
print "nicht vorhanden\n";
}

print Dumper \@move;

Ausgabe:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
$VAR1 = [
{
'234' => 'bier'
},
{
'234' => 'bier'
},
{
'234' => 'bier'
}
];
RalphFFM
 2008-08-18 14:21
#113643 #113643
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich möchte testen, ob der Key existiert _und!_ dieser einen ganz bestimmten Wert hat.
LanX-
 2008-08-18 14:21
#113644 #113644
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
Interessant was da im grep passiert !?!


[s]NACHTRAG:

http://www.unix.com.ua/orelly/perl/prog3/ch09_03.h...

HÄ???
OK ich nehm alles zurück und trink jetzt erstmal meinen zwoten Kaffee ...[/s]

NACHTRAG ZUM NACHTRAG: Rätsels Lösung:
bei meiner Bildschirmauflösung kann man ( und { kaum noch unterscheiden... ;)
dein AoH ist richtig der Fehler liegt in deinem Grep, nimm mal ==
Struppi
 2008-08-18 14:30
#113646 #113646
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Dann musst du den Vergleich auch durchführen.

Code (perl): (dl )
(grep { exists $_->{234} and  $_->{234} eq 'bar' } @move) {
LanX-
 2008-08-18 14:33
#113647 #113647
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
LanX-+2008-08-18 12:21:54--
nimm mal ==


vergiss es wieder, mit == würdest du nur die Refs vergleichen, Struppi hat recht.
RalphFFM
 2008-08-18 14:45
#113652 #113652
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Tatsächlich, Struppies Vorschlag funktioniert. Werde noch etwas drüber nachdenken um's nachzuvollziehen. Interessanterweise scheint es sogar ohne das 'exists' zu funktionieren?!?
Also nur
Code (perl): (dl )
(grep { $_->{234} and  $_->{234} eq 'bar' } @move) {
Gast Gast
 2008-08-18 14:49
#113653 #113653
Das "exists" ist nötig sonst wird automatisch der Hashkey "234" angelegt und der erste Teil der Abfrage wäre damit immer wahr!
Struppi
 2008-08-18 14:49
#113654 #113654
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Ja das tut es, aber dann solltest du eine Warnung bekommen.

[EDIT]ich sehe gerade, weder meine, noch die Anmerkung von Gast sind richtig. Du kannst auf exists verzichten, wobei ich das für sauberer halte und es ist ein Tick schneller.
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2008-08-18 13:49.