http://www.perlmonks.org?node_id=1036592

welle has asked for the wisdom of the Perl Monks concerning the following question:

Dear monks

I have a small set of records (like a table) stored in an array. I need to sort the array alphabetiacally according to the values in one particolar row. The array structure *should* be something like this

sentence1 attribute1 value1
sentence2 attribute2 value2
sentence3 attribute3 value3

What is wrong with this?

foreach my $sentence(@sentences){ #$attribute and $values come from other subrutines push(@array, ($sentence, $attribute, $value)); } my $selected_order=1;#order according to $attribute sort { $a->[$selected_order] cmp $b->[$selected_order] } @array; print @array;

I think, I'm confusing something with the array...

UPDATE: the problem is of course the array. Looking at it's content with use Data::Dumper; it clearly shows that the intended table structure is not mantained...

Replies are listed 'Best First'.
Re: sort array table
by poj (Abbot) on Jun 02, 2013 at 15:48 UTC
    You need to push array refs to @array to build a 2-dimensional array, retain the results of the sort and dereference to get the values.
    #!perl use strict; my @array=(); while (<DATA>){ chomp; my ($sentence, $attribute, $value) = split; # use [] not () to push array refs push @array,[$sentence,$attribute,$value]; } my $selected_order=1; #order according to $attribute # retain the result of sort in new array my @sorted_array = sort { $a->[$selected_order] cmp $b->[$selected_ord +er] } @array; # or use existing # @array = sort { $a->[$selected_order] cmp $b->[$selected_order] } @a +rray; # get values from sorted array # by dereferencing for my $record (@sorted_array){ print "@$record\n" }; __DATA__ sentence1 attribute3 value2 sentence2 attribute2 value1 sentence3 attribute1 value3
    poj

      It works perfectly. Thank you for the line by line explaination!