use strict; use warnings; use Data::Dumper; my @data; while () { next if !/\S/; push @data, [split]; } my @array; for my $i (0..$#data) { $array[$i][$i] = 0; for my $j ($i+1..$#data) { $array[$j][$i] = $array[$i][$j] = distance( $data[$i], $data[$j] ); } } print Dumper( \@array ); sub distance { my ($p1, $p2) = @_; return sqrt ( ($p1->[0] - $p2->[0]) ** 2 + ($p1->[1] - $p2->[1]) ** 2 + ($p1->[2] - $p2->[2]) ** 2 ); } __DATA__ 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5