in reply to Re: Indexing a data structure
in thread Indexing a data structure

I tried:
#!c:\perl\bin\perl.exe -w use strict; use warnings; use diagnostics; my @a; $a[1]{total} = 10; $a[2]{total} = 50; $a[3]{total} = 40; $a[4]{total} = 30; $a[5]{total} = 20; my @b = map { $_->[1] } sort { $b <=> $a } map { [ $a[ $_ ]->{total}, $_ ] } 0..$#a; for my $x (0..$#b) { print "$b[$x] = $a[$b[$x]]{total}\n"; }
And the output was:
5 = 20 4 = 30 3 = 40 2 = 50 1 = 10 Use of uninitialized value in concatenation (.) or ... 0 =
I understand the waring since the code refers to element 0 of the array @a when it was never defined. However the output is not what I expected. I was looking for:
2 = 50 3 = 40 4 = 30 5 = 20 1 = 10

Replies are listed 'Best First'.
Re: Re: Re: Indexing a data structure
by graff (Chancellor) on Oct 16, 2003 at 03:11 UTC
    I think the solution is actually simpler than what Fletch suggested:
    #!/usr/bin/perl use strict; use warnings; use diagnostics; my @ary; # let's avoid confusion with the $a and $b used by sort() $ary[0]{total} = 5; # let's avoid those silly warnings $ary[1]{total} = 10; $ary[2]{total} = 50; $ary[3]{total} = 40; $ary[4]{total} = 30; $ary[5]{total} = 20; my @bry = sort { $ary[$b]{total} <=> $ary[$a]{total} } 0..$#ary; for my $x (0..$#bry) { print "$bry[$x] = $ary[$bry[$x]]{total}\n"; } __OUTPUT__ 2 = 50 3 = 40 4 = 30 5 = 20 1 = 10 0 = 5
      That's great!! It's fast and returns the correct data. ++