#!/usr/bin/perl # # coords_2_dist_array.pl # # Given a list of coordinates in file , compute the array of point-to-point # distances. If FName isn't given, use DATA # use strict; use warnings; use autodie; my $IFH; my $FName = shift; if (defined $FName) { open $IFH, '<', $FName; } else { $IFH = \*DATA; } my @PTs; while (<$IFH>) { my @coords = split /\s+/,$_; push @PTs, [ @coords ] if @coords; } for my $i (0 .. $#PTs) { my @vals=(); for my $j (0 .. $#PTs) { push @vals, sprintf "%.2f", dist($PTs[$i], $PTs[$j]); } print join("\t", @vals), "\n"; } sub dist { my ($r1, $r2) = @_; # print ref($r1), " ", ref($r2),": ",join(",",@$r1), "; ", join(",",@$r2), "\n"; die "MISMATCH! $#$r1, $#$r2\n" unless $#$r1 == $#$r2; my $sum = 0; for my $i (0 .. $#$r1) { $sum += ($$r1[$i]-$$r2[$i])**2; } return sqrt($sum); } __DATA__ 0 0 300 -100 550 550 800 -200 1100 200 1250 0