User since
2006-11-16
258
Artikel
BenutzerIn
Hallo, ich möchte testen, ob ein bestimmter Hash innerhalb eines Arrays von Hashes vorhanden ist.
1
2
3
4
5
6
7
8
9
10
11
12
13
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.
User since
2008-07-15
1000
Artikel
BenutzerIn
[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)
User since
2006-02-17
628
Artikel
BenutzerIn
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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:
$VAR1 = [
{
'234' => 'bier'
},
{
'234' => 'bier'
},
{
'234' => 'bier'
}
];
User since
2006-11-16
258
Artikel
BenutzerIn
Ich möchte testen, ob der Key existiert _und!_ dieser einen ganz bestimmten Wert hat.
User since
2008-07-15
1000
Artikel
BenutzerIn
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 ==
User since
2006-02-17
628
Artikel
BenutzerIn
Dann musst du den Vergleich auch durchführen.
(grep { exists $_->{234} and $_->{234} eq 'bar' } @move) {
User since
2008-07-15
1000
Artikel
BenutzerIn
LanX-+2008-08-18 12:21:54-- nimm mal ==
vergiss es wieder, mit == würdest du nur die Refs vergleichen, Struppi hat recht.
User since
2006-11-16
258
Artikel
BenutzerIn
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
(grep { $_->{234} and $_->{234} eq 'bar' } @move) {
Das "exists" ist nötig sonst wird automatisch der Hashkey "234" angelegt und der erste Teil der Abfrage wäre damit immer wahr!
User since
2006-02-17
628
Artikel
BenutzerIn
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.