Be careful, for here you are using a closure. Remember, when an anonymous subroutine is defined, it uses whatever lexical variables are in scope at the time it was created. So:
use strict;
my @foo = ();
my $pushit = sub {
push @foo, @_;
};
$pushit->('apple');
$pushit->('orange');
print @foo, "\n";
will print "appleorange", but
use strict;
my @foo = ();
my $pushit = sub {
push @foo, @_;
};
my @foo = ();
$pushit->('apple');
$pushit->('orange');
print @foo, "\n";
will print nothing, since the @foo that is printed is not the same @foo that is being populated. (That'll also happen if you're not using strict, and somehow only declare @foo after the closure is created.) If this is the case, it'll show up if you turn warnings on... if the new @foo (or @coords in your case) is in the same scope as the other one. If @coords is file-scoped, you might well want to use 'our' instead of 'my'... that way you're guaranteed a single variable.
stephen