use strict; use warnings; use 5.010; my $data =<<"END_OF_DATA"; 1.000 64.103 2840.0 1.000 42.735 2840.0 1.000 32.051 2840.0 1.050 64.103 3280.0 1.050 42.735 3280.0 1.050 32.051 3280.0 1.100 64.103 3720.0 1.100 42.735 3720.0 1.100 32.051 3720.0 END_OF_DATA say $data; --output:-- 1.000 64.103 2840.0 1.000 42.735 2840.0 1.000 32.051 2840.0 1.050 64.103 3280.0 1.050 42.735 3280.0 1.050 32.051 3280.0 1.100 64.103 3720.0 1.100 42.735 3720.0 1.100 32.051 3720.0 my @lines; #OPEN YOUR FILE HERE: open my $INFILE, '<', \$data or die "Couldn't open string for reading: $!"; #What I did was I opened the string $data as if it were a file. #Now I can treat $INFILE as if it were a file... for my $line (<$INFILE>) { chomp $line; if($line) { push @lines, [split ' ', $line]; } } use Data::Dumper; say Dumper(\@lines); --output:-- $VAR1 = [ [ '1.000', '64.103', '2840.0' ], [ '1.000', '42.735', '2840.0' ], [ '1.000', '32.051', '2840.0' ], [ '1.050', '64.103', '3280.0' ], [ '1.050', '42.735', '3280.0' ], [ '1.050', '32.051', '3280.0' ], [ '1.100', '64.103', '3720.0' ], [ '1.100', '42.735', '3720.0' ], [ '1.100', '32.051', '3720.0' ] ]; my @sorted = sort{ $a->[1] <=> $b->[1] or $a->[0] <=> $b->[0]} @lines; say Dumper(\@sorted); --output:-- $VAR1 = [ [ '1.000', '32.051', '2840.0' ], [ '1.050', '32.051', '3280.0' ], [ '1.100', '32.051', '3720.0' ], [ '1.000', '42.735', '2840.0' ], [ '1.050', '42.735', '3280.0' ], [ '1.100', '42.735', '3720.0' ], [ '1.000', '64.103', '2840.0' ], [ '1.050', '64.103', '3280.0' ], [ '1.100', '64.103', '3720.0' ] ]; my @results = map {my @arr = @$_; join ' ', @arr} @sorted; say Dumper(\@results); --output:-- $VAR1 = [ '1.000 32.051 2840.0', '1.050 32.051 3280.0', '1.100 32.051 3720.0', '1.000 42.735 2840.0', '1.050 42.735 3280.0', '1.100 42.735 3720.0', '1.000 64.103 2840.0', '1.050 64.103 3280.0', '1.100 64.103 3720.0' ]; for (@results) { say; } --output:-- 1.000 32.051 2840.0 1.050 32.051 3280.0 1.100 32.051 3720.0 1.000 42.735 2840.0 1.050 42.735 3280.0 1.100 42.735 3720.0 1.000 64.103 2840.0 1.050 64.103 3280.0 1.100 64.103 3720.0