Thread Daten "Hashen"? (14 answers)
Opened by gmafx at 2010-11-25 22:39

topeg
 2010-11-29 19:03
#143192 #143192
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
2010-11-27T21:09:38 gmafx
Zuerst das Erstellen der Struktur:
Code: (dl )
push @{ $elements{$id}->[$_] }, $words[$_] for 0 .. $#words;


Was bedeutet das
Code: (dl )
@{
, ist das eine Autivivkation, sprich die Erstellung mehrerer Arrays (entsprechend der Spalten in der Datei)?

@{ ... } erzwingt ein Array Kontext (push erwartete ein Array als erstes Argument), es wird erstellt wenn es noch nicht existiert (das ist dann die Autovivikation)

2010-11-27T21:09:38 gmafx
Und das Drucken verstehe ich auch nicht :
Code: (dl )
1
2
for my $i ( 0 .. $#{$v} ) {
print " col $i: ". join( ', ', @{ $v->[$i] } ) ."\n";

Umgeschrieben:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
  my @value=@{$v};
  for my $pos_in_value (0..$#value)
  {
    print "  col $pos_in_value: ";
    my $array_ref=$value[$pos_in_value]
    my @colomns=@{$array_ref};
    print join( ', ', @colomns);
    print "\n";
  }

Ich hoffe das ist besser zu verstehen

2010-11-27T21:09:38 gmafx
Was ist bitte
Code: (dl )
$#{$v}

wenn du ein array hast (@array) gibt das die Position des letzten Eintrags an ($#array). Wenn du eine Arrayrefenz hast muss man den passenden Kontext erzwingen ($#{$array_ref} das kann man in dem Fall auch kürzer schreiben: $#$array_ref da klar ist was gemeint ist.)

2010-11-27T21:09:38 gmafx
Wie "heißen" denn nun eigentlich die 3 Arrays, die für die 3 Spalten angelegt wurden (Arrayreferenzen, oder?)? Wie kann ich gezielt Elemente ansprechen? Ich nehme an, ich muss dereferenzieren!??

Damit ich das endlich mal verstehe: wie spreche ich denn zum Besipiel für "ID1" den jeweils ersten Wert in den entsprechenden 3 Arrays an,

als Beispiel:
Von einer ID die erste spalte und davon den ersten Eintrag haben:
Code (perl): (dl )
my $value=$elements{$id}->[0]->[0]

du willst dir zu allen IDs ein Liste der zweiten spalten Ausgeben lassen:
Code (perl): (dl )
1
2
3
4
5
for my $id (keys(%elements))
{
  my @values=@{$elements{$id}->[1]}
  print "$id -> Col1: @values\n";
}

Bei perldoc perlreftut und perldoc perlref oder Wiki:perlreftut und Wiki:perlref findest du mehr hilfe.

2010-11-27T21:09:38 gmafx
noch lieber wäre es mir, die entsprechenden Werte einfach an "lesbare" Arraydefintionen zu Übergeben, etwa so.

Meinst du so ein Zugriff?:
Code (perl): (dl )
$first_value=$elements{$id}->{col1}->[0]
das wäre eine anderes Struktur:
Code (perl): (dl )
  push @{ $elements{$id}->{"col$_"} }, $words[$_] for 0 .. $#words;

und die veränderte Ausgabe:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
  my %colomns=%{$v};
  for my $col_name (sort keys(%colomns))
  {
    print "  $col_name: ";
    my $array_ref=$colomns{$col_name};
    my @entrys=@{$array_ref};
    print join( ', ', @entrys);
    print "\n";
  }

View full thread Daten "Hashen"?