Acme-Grep2D
view release on metacpan or search on metacpan
lib/Acme/Grep2D.pm view on Meta::CPAN
my $x = 0;
my $y = 0;
my $max = $nlines;
$max = $maxlen if $maxlen < $nlines;
# find text along diagonal L->R
for (my $char=0; $char < $maxlen; $char++) {
my @d;
$x = $char;
my $y = 0;
my @origin = ($x, $y);
map {
if ($y < $nlines && $x < $maxlen) {
my $char = substr($text[$y], $x, 1);
push(@d, $char) if defined $char;
}
$x++;
$y++;
} 0..$nlines-1;
unshift(@d, \@origin);
push(@diagLR, \@d) if @d;
}
for (my $line=1; $line < $nlines; $line++) {
my @d;
$x = 0;
my $y = $line;
my @origin = ($x, $y);
map {
if ($y < $nlines && $x < $maxlen) {
my $char = substr($text[$y], $x, 1);
push(@d, $char) if defined $char;
}
$x++;
$y++;
} 0..$nlines-1;
unshift(@d, \@origin);
push(@diagLR, \@d) if @d;
}
# find text along diagonal R->L
for (my $char=0; $char < $maxlen; $char++) {
my @d;
$x = $char;
my $y = 0;
my @origin = ($x, $y);
map {
if ($y < $nlines && $x >= 0) {
my $char = substr($text[$y], $x, 1);
push(@d, $char) if defined $char;
}
$x--;
$y++;
} 0..$nlines-1;
unshift(@d, \@origin);
push(@diagRL, \@d) if @d;
}
for (my $line=1; $line < $nlines; $line++) {
my @d;
$x = $maxlen-1;
my $y = $line;
my @origin = ($x, $y);
map {
if ($y < $nlines && $x >= 0) {
my $char = substr($text[$y], $x, 1);
push(@d, $char) if defined $char;
}
$x--;
$y++;
} 0..$nlines-1;
unshift(@d, \@origin);
push(@diagRL, \@d) if @d;
}
# find text along vertical
for (my $char=0; $char < $maxlen; $char++) {
my @d;
my @origin = ($char, $y);
push(@d, substr($text[$_], $char, 1)) for 0..$nlines-1;
unshift(@d, \@origin);
push(@vertical, \@d);
}
# correct LR to make text greppable
map {
my ($coords, @text) = @$_;
my $text = join('', @text);
$_ = [$text, $coords];
} @diagLR;
( run in 2.010 seconds using v1.01-cache-2.11-cpan-f985c23238c )