Leser: 34
2010-10-27T08:16:37 pqich versteh glaube ich das problem nicht.
am ehesten könnte ich mir vorstellen, dass du glaubst, man müsse die länge eines arrays vorher festlegen. aber das ist unnötig.
mit arrayreferenzen arbeiten ist schon das richtige.
oder ist es eher so, dass du nicht weisst, wieviele dimensionen das ganze haben wird? auch das lässt sich lösen, iterativ oder mit rekursion, kommt drauf an, woraus du das array füllen willst, um zu entscheiden, was schöner ist.
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 27 28 29 30 31 32 33 34 35 36 37 38
#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my %hash = ( 'A' => { 'Param 1' => [ 'Value 1' , 'Value 2' ] , 'Param 2' => [ 'Value 1' ] } , 'B' => { 'Param 1' => [ 'Value 1' ] } , 'C' => { 'Param 1' => [ 'value 1' ] } ); # Inhalt des HoHoA print Dumper \%hash; # Einen Wert abfragen print $hash{'A'}->{'Param 1'}->[1] . "\n"; # Einen Wert setzen $hash{'A'}->{'Param 1'}->[2]='Value 3'; print $hash{'A'}->{'Param 1'}->[2];
1 2 3 4 5 6
my %params; for(@Zeilen) { my($pre,$param,$value)=split_line($_); push(@{$params{$pre}->{$param}},$value); }
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
27
28
29
30
31
32
33
34
35
36
37
38
39
{
C => {
param1 => [
"value1",
"value2",
"value3",
],
param2 => [
"value1",
"value2",
],
param3 => [
"value1",
],
},
A => {
param1 => [
"value1",
],
param2 => [
"value1",
"value2",
],
},
B => {
param1 => [
"value1",
],
param2 => [
"value1",
"value2",
],
param3 => [
"value1",
"value2",
"value3",
],
},
};
2010-10-28T08:05:33 sebi85Der Ansatz ist nicht schlecht, aber ich habe immer noch das Problem, dass ich nicht mit einem Index wie bei einem Array arbeiten kann.
$array[0]->{'A'}->{'Param 1'}->[0]='Value 3';
QuoteIch habe 3 ineinandergeschachtelte For Schleifen.
In der ersten wird 'A' gesetzte in der zweiten dann 'Param1'...
QuoteHier möchte ich das erste {$FUNCTION_ARRAY[$i]->att('name') durch eine Index ersetzen, damit ich den Wert aus der 1. Schleife hätte, was ja aber nicht geht.
QuoteZudem ist der Hash nicht in der Reihenfolge, wie ich ihn gespeichert habe.
QuoteDas mit dem Split_line kapiere ich zwar noch nicht so ganz.
$array[1]->[0]->{foo}="bar";
Was bedeutet das {foo}?
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
my %DATA_HASH; for(my $i=0;$i<@FUNCTION_ARRAY;$i) { if($FUNCTION_ARRAY[$i]->gi() eq 'TestFunction') { my $temp_func = $FUNCTION_ARRAY[$i]->att('name'); $i++; for(my $j=0;$FUNCTION_ARRAY[$i]->gi() ne 'TestFunction';$j++) { if($FUNCTION_ARRAY[$i]->gi() eq 'Parameter') { my $temp_param = $FUNCTION_ARRAY[$i]->att('name'); for(my $k=0;$FUNCTION_ARRAY[$i]->gi() ne 'TestFunction';$k++) { if($FUNCTION_ARRAY[$i]->gi() eq 'ParameterValue') { $DATA_HASH{$temp_func}->{$temp_param}->{$k}=$FUNCTION_ARRAY[$i]->att('value'); } $i++; } } } $cnt++; } $i++; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
my %DATA_HASH; for(my $i=0;$i<@FUNCTION_ARRAY;$i++) { if($FUNCTION_ARRAY[$i]->gi() eq 'TestFunction') { my $temp_func = $FUNCTION_ARRAY[$i]->att('name'); $i++ while($FUNCTION_ARRAY[$i]->gi() ne 'Parameter'); my $temp_param = $FUNCTION_ARRAY[$i]->att('name'); my $temp_pos=$i; $i++ while($FUNCTION_ARRAY[$i]->gi() ne 'ParameterValue'); $temp_pos=$i-$temp_pos; $DATA_HASH{$temp_func}->{$temp_param}->{$pos}=$FUNCTION_ARRAY[$i]->att('value')); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
%DATA_HASH=( A => { param1 => { 0 => "value2", 5 => "value3", 2 => "value4", }, }, B => { param1 => { 5 => "value1", }, param2 => { 1 => "value1", 0 => "value2", 7 => "value3", 5 => "value4", }, param3 => { 0 => "value1", 1 => "value2", }, }, );
1 2 3 4 5 6 7 8 9 10 11 12 13 14
my %DATA_HASH; for(my $i=0;$i<@FUNCTION_ARRAY;$i++) { if($FUNCTION_ARRAY[$i]->gi() eq 'TestFunction') { my $temp_func = $FUNCTION_ARRAY[$i]->att('name'); $i++ while($FUNCTION_ARRAY[$i]->gi() ne 'Parameter'); my $temp_param = $FUNCTION_ARRAY[$i]->att('name'); $i++ while($FUNCTION_ARRAY[$i]->gi() ne 'ParameterValue'); push(@{$DATA_HASH{$temp_func}->{$temp_param}},$FUNCTION_ARRAY[$i]->att('value')); } }
2010-10-28T10:52:11 sebi85Beide Variaten können garnicht funktionieren, da immer nur etwas gemacht wird, wenn
if($FUNCTION_ARRAY[$i]->gi() eq 'TestFunction')
zutrifft.
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 27 28
my %DATA_HASH; for(my $i=0;$i<@FUNCTION_ARRAY;$i) { if($FUNCTION_ARRAY[$i]->gi() eq 'TestFunction') { my $temp_func = $FUNCTION_ARRAY[$i]->att('name'); $i++; for(my $j=0;$FUNCTION_ARRAY[$i]->gi() eq 'Parameter';$j++) { if($FUNCTION_ARRAY[$i]->gi() eq 'Parameter') { my $temp_param = $FUNCTION_ARRAY[$i]->att('name'); $i++; for(my $k=0;$FUNCTION_ARRAY[$i]->gi() eq 'ParameterValue';$k++) { $DATA_HASH{$temp_func}->{$temp_param}->[$k]=$FUNCTION_ARRAY[$i]->att('value'); $i++; } if($FUNCTION_ARRAY[$i]->gi() eq 'TestFunction') { $i--; last; } } } } $i++; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
my %DATA_HASH; for(my $i=0;$i<@FUNCTION_ARRAY;$i++) { if($FUNCTION_ARRAY[$i]->gi() eq 'TestFunction') { my $temp_func = $FUNCTION_ARRAY[$i++]->att('name'); while($FUNCTION_ARRAY[$i]->gi() eq 'Parameter') { my $temp_param = $FUNCTION_ARRAY[$i++]->att('name'); while($FUNCTION_ARRAY[$i]->gi() eq 'ParameterValue') { push(@{$DATA_HASH{$temp_func}->{$temp_param}},$FUNCTION_ARRAY[$i++]->att('value')); } } $i-- if($FUNCTION_ARRAY[$i]->gi() eq 'TestFunction'); } }
1
2
3
4
5
my @array;
$array[1] = [ # array referenz
{ foo => 'bar' }, # element 0: hash referenz
];
1 2 3 4 5 6 7 8 9
my %hash; for my $name ( qw(nummern tests) ){ $hash{$name} = [ "1. $name", "2. $name" ]; } my @nummern = @{ $hash{nummern} }; print "@nummern";