Thread hashes of hashes (6 answers)
Opened by hannesPR at 2010-10-01 03:55

torsten
 2010-10-01 09:53
#141606 #141606
User since
2010-08-16
45 Artikel
BenutzerIn
[Homepage] [default_avatar]
Also, das geht natürlich auch mit Arrays. Und ich würde Dir dringend raten es mit Arrays zu machen, denn diese sind in Perl deutlich schneller als Hashes, obwohl das natürlich auch geht.

2010-10-01T01:55:40 hannesPR
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
...
for ($i=0;$i<20;$i++)
{
 for ($ii=0;$ii<40;$ii++)
 {
  %matrix=($i => { $ii => "X"});
 }
}
...


Hier überschreibst Du das Hash jedes mal komplett neu. Am Schluß hast Du ein Hash mit nur einem Element:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
$ perl -MData::Dumper -e 'for ($i=0;$i<20;$i++)
> {
> for ($ii=0;$ii<40;$ii++)
> {
> %matrix=($i => { $ii => "X"});
> }
> }
> print Dumper \%matrix'
$VAR1 = {
'19' => {
'39' => 'X'
}
};


Mit Arrays könntest Du z.B. wie folgt arbeiten:

Code (perl): (dl )
1
2
3
4
5
6
7
@arr=map {[$_ .. $_+39]} (0..19);
for( $i=0; $i<@arr; $i++ ) {
  for( $j=0; $j<@{$arr[$i]}; $j++ ) {
    printf "%02d, ", $arr[$i]->[$j];
  }
  print "\n";
}


Bis auf die Initialisierung ist das aber nicht sehr perlig.

Code (perl): (dl )
1
2
@arr=map {[$_ .. $_+39]} (0..19);
print join("\n", map { my $l=$_; join(", ", map { sprintf "%02d", $_ } @$l) } @arr), "\n";


Führt (fast (siehe Zeilenenden)) zum selben Resultat.

Oder auch
Code (perl): (dl )
1
2
@arr=map {[$_ .. $_+39]} (0..19);
printf +("%02d, " x @$_)."\n", @$_ for @arr

View full thread hashes of hashes