>>553
部分マップを別配列に切り出す方向で考えてみた。

my $map_width = length($map[0]);
my $map_height = scalar(@map);

sub max { $_[$_[0] < $_[1]]; }
sub min { $_[$_[0] > $_[1]]; }

sub trim_map {
 my ($x, $y) = @_;
 my $x1 = max(0, $x - 2);
 my $x2 = min($map_width, $x + 2);
 my $y1 = max(0, $y - 2);
 my $y2 = min($map_height, $y + 2);
 return map { substr($_, $x1, $x2 - $x1 + 1) } @map[$y1 .. $y2];
}

my @mini_map = trim_map(5, 3);
print "$_\n" foreach @mini_map;