use strict; use Data::Dumper; my @expos; chomp( @expos = ); @expos = map { "$_->[0]|$_->[1]/$_->[2]|$_->[3]/".(join "|", @{$_}[4..$#$_]) } sort { $a->[1] <=> $b->[1] or $a->[2] <=> $b->[2] } map { [ split '[|/]', $_, 8 ] } @expos; print Dumper \@expos; __DATA__ Macworld Expo|2/7|1/12|San Francisco|CA|http://www.macworldexpo.com Another Expo|1/27|2/5|San Francisco|CA|http://www.anotherexpo.com Some Expo|1/6|1/12|San Francisco|CA|http://www.macworldexpo.com