Font
[thread]6031[/thread]

Bearbeiten von Hash werten: Stell ich mich zu doof an ??



<< |< 1 2 >| >> 14 entries, 2 pages
Patrick
 2004-01-22 14:22
#79363 #79363
User since
2004-01-07
56 articles
BenutzerIn
[default_avatar]
Ich versuche verzweifelt auf ein bestimmtes Feld in einem Hash zuzugreifen und es auszulesen bzw. später zu ändern.

Aber es glingt mir ums verrecken nicht!

Jetzt bitte ich Euch um Hilfe!

So funktioniert die Ausgabe
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# Jetzt wieder ausgeben!
my $key;
# Fuer alle Keywords
  for $key (@{$params{keywords}})
  {
# erst die freien Kommentare, falls vorhanden
     if (exists $params{$key}{precomments})
     {
        print "# ", $_, "\n" for @{$params{$key}{precomments}};
     }
  }
# dann die einzelnen Schluessel und Werte
  print "$key = ";
  my @vals = ();
  foreach my $val (@{$params{$key}{values}})
  {
     my $str = $val;
     if (exists $params{$key}{comments}{$val})
     {
        $str .= "\t# " . join " \\\n\t\t\t# ",
        @{$params{$key}{comments}{$val}};
     }
     push @vals, $str;
  }
#   print join " \\\n\t\t", @vals;
#   print "\n";


Ich versuche es nun so!

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
my $key;   
  print "$key = ";   #  zeile 181
  my @vals = ();
  foreach my $val (@{$params{$key}{values}})   #  Zeile 183
  {
#   my $str = $val;
     if ($params{$key} == "GENLIST")
     {
        $genlist = $params{$key}{values}[0];
     }
  }


ich bekomme aber ständig folgende Meldung:

Quote
Use of uninitialized value in concatenation (.) or string at Test.pl line 181.
= Use of uninitialized value in hash element at Test.pl line 183.
Use of uninitialized value in hash element at Test.pl line 183.


Was mach ich falsch
Mfg
Paddy

Perl ist göttlich, die Kunst besteht darin Perl anwenden zu können.
format_c
 2004-01-22 14:47
#79364 #79364
User since
2003-08-04
1706 articles
HausmeisterIn
[Homepage] [default_avatar]
Kennst du Data::Dumper? Damit kannst du wunderbar deine komplexen Datenstrukturen überprüfen, ob die auch so aussehen wie sie es sollen.
Code: (dl )
1
2
use Data::Dumper;
print Dumper \%hash;


Probier mal und überleg, wie soll das Hash aussehen; wie sieht es aus.
Dann solltest du mit etwas überlegungen zum Ziel kommen.

Gruß Alex
Patrick
 2004-01-22 15:02
#79365 #79365
User since
2004-01-07
56 articles
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
'KEY1' => {
'precomments' => [
'',
'Kommentar',
''
],
'values' => [
'Wert'
],
'comments' => {
'Wert' => [
'Kommentar'
]
}

'KEY2' => {
'values' => [
'Wert'
],
'comments' => {
'Wert' => [
'Kommentar'
]
}
}


So sieht es bei einer Ausgabe mit

use Data::Dumper;
print Dumper \%params;

aus.

Und ich komme einfach nicht auf die richtige Lösung!

Ich habe es mal so versucht!
Code: (dl )
$key1 = $params{KEY1}{values};

Aber wieder nix.
Mfg
Paddy

Perl ist göttlich, die Kunst besteht darin Perl anwenden zu können.
Dubu
 2004-01-22 15:46
#79366 #79366
User since
2003-08-04
2145 articles
ModeratorIn + EditorIn

user image
[quote=Patrick,22.01.2004, 13:22]
So funktioniert die Ausgabe
[/quote]
Nein, tut sie nicht.
Du beendest einfach die Schleife ueber $key und gibst danach noch Werte aus - somit erhaeltst du dort nur die Werte zu dem letzten Schluessel aus der Schleife.

Schau dir bitte nochmal meinen Code an, bzw. ueberlege dir erstmal, was du aenderst.

Quote
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
# Jetzt wieder ausgeben!
my $key;
# Fuer alle Keywords
  for $key (@{$params{keywords}})
  {
# erst die freien Kommentare, falls vorhanden
     if (exists $params{$key}{precomments})
     {
        print "# ", $_, "\n" for @{$params{$key}{precomments}};
     }
  }

Hier ist jetzt die Schleife ueber $key auf einmal vorbei. Zum Ende hat $key den Wert des letzten Elementes aus dem Array @{$params{keywords}}.

Quote
Code: (dl )
1
2
3
4
5
# dann die einzelnen Schluessel und Werte
  print "$key = ";
  my @vals = ();
  foreach my $val (@{$params{$key}{values}})
...

Hier benutzt du aber wieder $key. Der ist zwar definiert, aber eben immer nur auf das letzte Element von oben.

Quote
Ich versuche es nun so!

Code: (dl )
1
2
3
my $key;   
  print "$key = ";   #  zeile 181
...

Du hast $key hier gar keinen Wert zugewiesen, deshalb die Warning, dass $key nicht definiert ist. (Es ist deklariert, aber nicht definiert!)

Schreib einfach
my $key = "KEY1";
oder so, und du solltest eine Ausgabe bekommen.
Patrick
 2004-01-22 15:59
#79367 #79367
User since
2004-01-07
56 articles
BenutzerIn
[default_avatar]
Ok,
mal ein anderer Versuch!

Code: (dl )
1
2
3
4
5
6
7
8
9
10
my $key;
# Fuer alle Keywords
  for $key (@{$params{keywords}})
  {
# erst die freien Kommentare, falls vorhanden
     if ($params{$key} == "KEY1")
     {
        $key1 = ${$params{$key}{values}};
     }
  }


Das klappt aber alles nicht.

Ich muss doch irgendwie direkt auf den Wert in dem Hash of Array zugreifen können und den entsprechenden Wert auslesen bzw. ändern können!\n\n

<!--EDIT|Patrick|1074780078-->
Mfg
Paddy

Perl ist göttlich, die Kunst besteht darin Perl anwenden zu können.
format_c
 2004-01-22 16:10
#79368 #79368
User since
2003-08-04
1706 articles
HausmeisterIn
[Homepage] [default_avatar]
Frage: Wie kann in $params{$key} einmal ein String GENLIST und gleichzeitig ein anonymes Hash drin sein?

Ich versteh nicht wie die Struktur des Hashes ist und was für ein Sinn dahinter steht.
Er zähl doch mal genau wie sich deine Datenstruktur zusammensetzt und was für ein Sinn damit verbunden ist. Vielleicht können wir das dann nachvollziehen und dir besser helfen.

Und was oist das?
Code: (dl )
$genlist = ${$params{$key}{values}};

Du dereferenzierst den Key als scalar ist aber lauf Data::Dumper eine Liste. Und übergibst dies an ein Scalar?
Kappier ich nicht
Entweder:
Code: (dl )
1
2
3
4
5
# jetzt haben wir eine Array-Referenz in $genlist
$genlist = \@{$params{$key}{values}};
# oder
@genlist = @{$params{$key}{values}};
# jetzt kopieren wir die Werte einfach ins Array @genlist


Gruß Alex
format_c
 2004-01-22 16:13
#79369 #79369
User since
2003-08-04
1706 articles
HausmeisterIn
[Homepage] [default_avatar]
Oha nicht GENLIST sondern KEY1. Na dann sieht die sache schon wieder anders aus.
Dann solltest du deine if-Anweisung wie folgt ändern:
Code: (dl )
1
2
if ($key eq 'KEY1') {# String vergleiche werden mit dem Operator eq gemacht
...
format_c
 2004-01-22 16:18
#79370 #79370
User since
2003-08-04
1706 articles
HausmeisterIn
[Homepage] [default_avatar]
Was soll jetzt in $key1 enthalten sein?`
Eine Liste?, Eine Refenenz auf eine Liste, ein string?
BTW: Wenn du was an deinem Beitrag änderst, vermerke doch bitte mir Edit: was du geändert hast. Den Text jedesmal Wort für Wort zu lesen ist ziemlich mühsehlig.

Gruß Alex
Crian
 2004-01-22 16:34
#79371 #79371
User since
2003-08-04
5871 articles
ModeratorIn
[Homepage]
user image
[quote=Patrick,22.01.2004, 13:22]
Code: (dl )
1
2
my $key;   
  print "$key = ";   #  zeile 181


ich bekomme aber ständig folgende Meldung:

Quote
Use of uninitialized value in concatenation (.) or string at Test.pl line 181.


Was mach ich falsch[/quote]
Wen wunderts, $key ist natürlich undefiniert!
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Dubu
 2004-01-22 16:37
#79372 #79372
User since
2003-08-04
2145 articles
ModeratorIn + EditorIn

user image
[quote=Patrick,22.01.2004, 14:02]Ich habe es mal so versucht!
Code: (dl )
$key1 = $params{KEY1}{values};

Aber wieder nix.[/quote]
Du scheinst noch ein paar konzeptionelle Probleme mit Skalaren, Referenzen und Arrays zu haben. %params ist ein Hash, $params{KEY1} ist hier eine Referenz auf einen weiteren Hash, $params{KEY1}{values} ist wiederum eine Referenz auf ein Array, dass alle Werte zum Keyword KEY1 enthaelt. Das Array selber wird dann mit @{$params{KEY1}{values}} angesprochen.
Der erste skalare Wert darin ist $params{KEY1}{values}->[0] bzw. $params{KEY1}{values}[0] (da man an dieser Stelle den Pfeil weglassen kann) bzw. ${$params{KEY1}{values}}[0], wenn man so moechte.

Es waere auch besser gewesen, du haettest im alten Thread weiter gefragt, da war zumindest der Zusammenhang da.
<< |< 1 2 >| >> 14 entries, 2 pages



View all threads created 2004-01-22 14:22.