Kort beskrivet går det ut på att man skapar en temporär (namnlös) tvådimensionell array m.h.a. funktionen map().
Denna array är uppbyggd enligt följande:
[[Rad1 från orginalarrayen],[Det fält vi skall sortera på]],
[[Rad2 från orginalarrayen],[Det fält vi skall sortera på]],
o.s.v.
Det fält vi skall sortera på plockar vi ut m.h.a. ett reguljärt uttryck.
Sedan sorterar vi denna temporära array med perls inbyggda funktion sort().
I slutändan använder vi den temporära arrayen för att skapa arrayen @sorted_values som då kommer att innehålla orginalearrayen, sorterad på det vi plockade ut m.h.a. det reguljära uttrycket i början.
Koden skall läsas nerifrån och upp:
map { [ $_, ((/^[^|]*\|([^|]*)/)[0]) ] } @values;
Här skapar vi den temporära, tvådimensionella arrayen. Resultatet av detta matar vi in i nästa led ...
sort { $b->[1] <=> $a->[1] }
... som sorterar på den "andra dimensionen" i denna array. Resultatet av denna sortering matar vi in i nästa led ...
map { $_->[0] }
... som skapar en temporär endimensionell array från den "första dimensionen" ur den tvådimensionella, sorterade, arrayen. Nu har vi alltså en sorterad, endimensionell array. Allt vi behöver göra är att stoppa undan den i en variabel, och det gör vi i nästa led.
my @sorted_values =
Detta är lite överkurs, och koden kan se rörig och obegriplig ut för den ovane. Samtidigt är sådana här "hack" lite av tjusningen med Perl tycker jag. Det är sådant som gör språket unikt gentemot andra språk. :)
För en djupare analys rekommenderas som sagt manualen:
'perldoc -q sort'
ftp://ftp.sunet.se/pub/lang/perl/CPAN/doc/FMTEYEWTK/sort.html
------------------
Robban < robban@lipogram.com >