Schrift
[thread]8440[/thread]

Hash Schlüssel und Werte aus Variablen



<< >> 2 Einträge, 1 Seite
Gast Gast
 2006-10-21 05:17
#71057 #71057
...das erste Mal mit "hashes", bitte habt Nachsicht ...
Also, ich versuche ein Hash zu erzeugen unter Benutzung von Variablen, aber es klappt nicht. Eine csv-Datei wird geöffnet und daraus sollen die Schlüssel und Werte in das Hash eingefügt werden. Ich weis nicht mehr weiter.

Die Fehlermeldung:
Reference found where even-sized list expected at D:\perl\hash.pl line 27, <SERVICE> line 920.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use strict;
use warnings;
system "cls";

my $filnr;
my $sn;
open SERVICE, "datei.csv"
or die "Kann datei.csv nicht oeffnen ($!)";
while (<SERVICE>){
if (defined ($_)){
$nr=((split /;/,$_)[0]);
$sn=((split /;/,$_)[6]);
my %sn_service = {
"$sn" => "$nr",
# $fake_sn => $fake_filnr,
}
}
}
sid burn
 2006-10-21 06:08
#71058 #71058
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Code: (dl )
1
2
3
4
my %sn_service = {
"$sn" => "$nr",
# $fake_sn => $fake_filnr,
}

Quote
Reference found where even-sized list expected at D:\perl\hash.pl line 27, <SERVICE> line 920.


Du erstellst ein Hash mit "my %sn_service". Um ein Hash zu füllen musst du eine Liste zuordnen. Das geht mit runden Klammern.

Mit geschweiften Klammern erzeugst du eine Referenz auf ein anonymes Hash. Dieses Speicherst du üblicherweise in Skalare.


Zum anderen denke ich aber das du nicht das haben möchtest was dein Code macht. Dein Code erzeugt mit jedem Schleifendurchlauf ein neues Hash, speichert dort etwas, und danach wird es wieder verworfen.

Du musst also das Hash vor der while Schleife erzeugen, und nicht in der while Schleife.


Auf einen einzelnen Wert im Hash greifst du folgendermaßen zu:
Code: (dl )
$hash{key}
Damit liest du den Wert aus. Setzen ist auch einfach.
Code: (dl )
$hash{key} = 'value'
.

Sollte der "key" beim Setzen nicht existieren, wird er automatisch angelegt. Das letzt ist also auch gleichzeitig ein Beispiel wie du neue Werte einem Hash hinzufügst.


Ansonsten sei noch angemerkt das es nicht Ausreicht die Werte einer CSV Datei mit einem split() zu trennen. Folgende Zeile ist eine gültige CSV Zeile und enthält 3 Werte.
Code: (dl )
"Hi; blub";foo;bar

1) Hi; blub
2) foo
3) bar


Vielleicht dürfte dieser Code deinen Anforderungen etwas mehr entsprechen.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my %sn_service;
while ( defined(my $line = <DATA>) ) {
my ($nr, $sn) = (split /;/, $line)[0,6];
chomp ($nr, $sn);
$sn_service{"$sn"} = $nr;
}
print Dumper \%sn_service;

__DATA__
hallo;welt;wie;geht;es;dir;heute
hi;mir;scheint;es;heute;gut;zu
gehen;danke;der;nachfrage;was;macht;die


CSV Dateien werden aber auch in diesem Beispiel nicht korrekt verarbeitet.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
<< >> 2 Einträge, 1 Seite



View all threads created 2006-10-21 05:17.