#!/usr/bin/perl $string = << "END"; ABC DEF GHI END for $a (0 .. 2){ for $b (0 .. 2) { ($u,$l,$P,$r,$d) = prox($string, $a, $b); print "$P: u=$u, l=$l, r=$r, d=$d\n"; } } sub prox { my ($str,$r,$c) = @_; my $rlen = index($str, "\n"); my $skip = '.' x (($rlen + 1) * $r + $c); my $b = '.' x $rlen; my $f = '.' x $rlen; return $str =~ m{ ^ (?s:$skip) # get to specific row and column (?s:(?<=(.)$b)?) # previous row ($1) (?<=(.))? # previous column ($2) (.) # this row, this column ($3) (?=(.))? # next column ($4) (?s:(?=$f(.))?) # next row ($5) }x; }