Hash dynaisch erzeugen
roger
- perl
Hallo,
Ich erzeuge mehrere Hash dynamisch
for ($i=0; $i < 10; $i++)
{
%{"ITEM$i"} = ("foo","bar");
}
Natürlich kommt folgende Fehlermeldung.
Can't use string ("ITEM0") as a HASH ref while "strict refs" in use at ./database line 77.
Wie kann ich hier my einfließen lassen, oder die Meldung "nur" für diese Codezeile blockieren ????
Gruß
roger
Ich erzeuge mehrere Hash dynamisch
Was du tunlichst unterlassen solltest.
for ($i=0; $i < 10; $i++)
{
%{"ITEM$i"} = ("foo","bar");
}
Verwende statt dessen:
~~~perl
use strict;
my %DATA;
for(0 .. 9){
$DATA{$_} = ["foo","bar"];
}
mfg Beat
Hallo,
ich habe hier Probleme beim verwirklichen
Ich habe ein Hash das Referenzen auf andere Hash besitzt.
Diese Hash sind Speziell (Indexed)
tie my %daten, "Tie::Hash::Indexed" or die $!;
tie my %maschinen, "Tie::Hash::Indexed" or die $!;
my $mem_masch='';
($masch,$varname,$wert) = split(/;/,$_);
if ($mem_masch eq '') { $mem_masch = $masch; }
if ($masch eq $mem_masch)
{
$daten{$masch}{$varname} = $wert;
}
else
{
$maschinen{$counter} = ["foo","bar"];
$counter++;
$daten{$masch} = \$maschinen{$counter};
$daten{$masch}->{$varname} = $wert;
$mem_masch = $masch;
}
$daten{$masch}->{$varname} = $wert;
Erklärung: wenn $masch sich ändert dann soll ein neues Hash erzeugt werden und dessen Referenz auf das "Haupt" Hash geschreiben werden unter dem key $masch. Das spezielle Hash (Indexed) muss sein, wegen der Reihenfolge.
Der Interpreter mault "Not a HASH reference at ...." Zeile ""$daten{$masch}->{$varname} = $wert;""
.... und ich sehe es nicht.
Gruß
roger
ich habe hier Probleme beim verwirklichen
Gz hast vor allem Verständnisprobleme mit
Hashes, Array und deren Referenzen
$var = [1,2]; #weist eine Arrayreferenz zu
$var = {a=>1}; #weist eine Hashreferenz zu
Weise einer Variable immer nur einen Datentyp zu. Mische nicht die Datentypen.
Ich habe ein Hash das Referenzen auf andere Hash besitzt.
Diese Hash sind Speziell (Indexed)
tie my %daten, "Tie::Hash::Indexed" or die $!;
tie my %maschinen, "Tie::Hash::Indexed" or die $!;my $mem_masch='';
($masch,$varname,$wert) = split(/;/,$_);
if ($mem_masch eq '') { $mem_masch = $masch; }
if ($masch eq $mem_masch)
{
$daten{$masch}{$varname} = $wert;
Hier weist du einen Scalar zu
}
else
{
$maschinen{$counter} = ["foo","bar"];
Hier weist du eine Array-referenz zu.
$counter++; $daten{$masch} = \$maschinen{$counter};
ist dasselbe wie
$daten{$masch} = ["foo","bar"];
Hier weisst du eine Referenz auf den Inhalt, welcher bereits eine Arrayreferenz ist, zu. Schaffst also eine Inkonsistenz.
Entweder ist ein Scalar oder eine Array-Ref-Ref vorhanden.
$daten{$masch}->{$varname} = $wert;
Hier aber rechnest du damit dass $daten($masch) eine hashreferenz enthält
$mem_masch = $masch;
}
$daten{$masch}->{$varname} = $wert;
> Erklärung: wenn $masch sich ändert dann soll ein neues Hash erzeugt werden und dessen Referenz auf das "Haupt" Hash geschreiben werden unter dem key $masch. Das spezielle Hash (Indexed) muss sein, wegen der Reihenfolge.
>
> Der Interpreter mault "Not a HASH reference at ...." Zeile ""$daten{$masch}->{$varname} = $wert;""
Ich sehe nicht, was für Daten du speichern willst.
Warum erzeugst du nicht einfach einen Hash. Jeder Maschine wird eine hashreferenz zugewiesen.
$daten{$masch} = {
index => $counter,
name => $varname,
value => $value,
};
Falls du eine neue Maschine anlegst kannst du den bisherigen Index abfragen mit
my $num\_of\_maschines = scalar keys $daten;
mfg Beat
--
><o(((°> ><o(((°>
<°)))o>< ><o(((°>o
Der Valigator leibt diese Fische
Hallo,
tie my %daten, "Tie::Hash::Indexed" or die $!;
tie my %maschinen, "Tie::Hash::Indexed" or die $!;
$maschinen{$counter} = ["foo","bar"];
$daten{$masch} = $maschinen{$counter};
Warum erzeugst du nicht einfach einen Hash. Jeder Maschine wird eine hashreferenz zugewiesen.
$daten{$masch} = {
index => $counter,
name => $varname,
value => $value,
};
Natürlich soll es so in etwa aussehen, jedoch kann ich kein normales Hash benutze, sondern "MUSS" das Indexed Hash benutzen, die Reihenfolge wird bei der Erzeugung festegelegt und muss immer gleich bleiben.
$daten{$masch} = referenz von Indexed-Hash [x]
$maschinen[x] = namex => value, namey => value, name... =>value
$daten{$masch} = referenz von Indexed-Hash [y]
$maschinen[y] = namex => value, namey => value, name... =>value
usw.
zugreifen will ich $daten{'masch'}{'messwertname'} = 'messwert'
das geht schneller einfacher als jedesmal den Index abzufragen.
Danke
roger
tie my %daten, "Tie::Hash::Indexed" or die $!;
tie my %maschinen, "Tie::Hash::Indexed" or die $!;my $mem_masch='';
($masch,$varname,$wert) = split(/;/,$_);
if ($mem_masch eq '') { $mem_masch = $masch; }
if ($masch eq $mem_masch)
{
$daten{$masch}$varname} = $wert;
}
else
{
$maschinen{$counter} = ["foo","bar"];
$counter++;
$daten{$masch} = $maschinen{$counter};$daten{$masch}->{$varname} = $wert; $mem_masch = $masch;
}
$daten{$masch}->{$varname} = $wert;
Das Problem ist, du erstellst keine Referenz auf $daten{$masch}, um $daten{$masch}->{$varname} zu nutzen musst du erst eine Hashreferenz erzeugen.
`$daten{$masch} = {} unless $daten{$masch};`{:.language-perl}
Struppi.