Acme-Grep2D
view release on metacpan or search on metacpan
lib/Acme/Grep2D.pm view on Meta::CPAN
=cut
sub grep_hf {
my ($self, $re) = @_;
my @matches;
my $n = 0;
# find things "normally," like a regular grep
foreach (@{$.text}) {
my $text = $_;
while ($text =~/($re)/g) {
push(@matches, [length($1), _start(\$text,$1), $n, 1, 0, \$_])
}
$n++;
};
return @matches;
}
=head2 B<grep_hr>
@matches = $g2d->grep_hf($re);
lib/Acme/Grep2D.pm view on Meta::CPAN
sub grep_hr {
my ($self, $re) = @_;
my @matches;
my $n = 0;
# find things "normally," like a regular grep
foreach (@{$.text}) {
my $text = $_;
$text = ./_reverse($text);
while ($text =~/($re)/g) {
push(@matches,
[length($1), length($text)-(_start(\$text,$1)+1),
$n, -1, 0, \$_])
}
$n++;
};
return @matches;
}
=head2 B<grep_h>
@matches = $g2d->grep_h($re);
lib/Acme/Grep2D.pm view on Meta::CPAN
=cut
sub grep_vf {
my ($self, $re) = @_;
my @matches;
# find things in the vertical vector
foreach (@{$.vertical}) {
my ($text, $coords) = @$_;
my ($x, $y) = @$coords;
push(@matches, [length($1), $x, _start(\$text, $1),
0, 1, \$_]) while ($text =~ /($re)/g);
}
return @matches;
}
=head2 B<grep_vr>
@matches = grep_vr($re);
Search text vertically, up.
lib/Acme/Grep2D.pm view on Meta::CPAN
=cut
sub grep_vr {
my ($self, $re) = @_;
my @matches;
# find things in the vertical vector
foreach (@{$.vertical}) {
my ($text, $coords) = @$_;
my ($x, $y) = @$coords;
$text = ./_reverse($text);
push(@matches, [length($1),$x, length($text)-_start(\$text, $1)-1,
0, -1, \$_]) while ($text =~ /($re)/g);
}
return @matches;
}
=head2 B<grep_v>
@matches = $g2d->grep_v($re);
Search text vertically, both directions.
lib/Acme/Grep2D.pm view on Meta::CPAN
=cut
sub grep_rlf {
my ($self, $re) = @_;
my @matches;
# find things in the R->L diagonal vector
foreach (@{$.diagRL}) {
my ($text, $coords) = @$_;
my ($x, $y) = @$coords;
while ($text =~ /($re)/g) {
my $off = _start(\$text, $1);
my $length = length($1);
push(@matches, [$length, $x-$off, $off+$y, -1, 1, \$_]);
}
}
return @matches;
}
=head2 B<grep_rlr>
@matches = $g2d->grep_rlr($re);
lib/Acme/Grep2D.pm view on Meta::CPAN
# find things in the R->L diagonal vector
foreach (@{$.diagRL}) {
my ($text, $coords) = @$_;
my ($x, $y) = @$coords;
$text = ./_reverse($text);
$x -= length($text);
$y += length($text);
$x++;
$y--;
while ($text =~ /($re)/g) {
my $off = _start(\$text, $1);
my $length = length($1);
push(@matches, [$length, $x+$off, $y-$off, 1, -1, \$_]);
}
}
return @matches;
}
=head2 B<grep_rl>
@matches = $g2d->grep_rlf($re);
lib/Acme/Grep2D.pm view on Meta::CPAN
=cut
sub grep_lrf {
my ($self, $re) = @_;
my @matches;
# find things in the L->R diagonal vector
foreach (@{$.diagLR}) {
my ($text, $coords) = @$_;
my ($x, $y) = @$coords;
while ($text =~ /($re)/g) {
my $off = _start(\$text,$1);
push(@matches,
[length($1), $x+$off, $off+$y, 1, 1, \$_])
}
}
return @matches;
}
=head2 B<grep_lrr>
@matches = $g2d->grep_lrr($re);
lib/Acme/Grep2D.pm view on Meta::CPAN
sub grep_lrr {
my ($self, $re) = @_;
my @matches;
# find things in the L->R diagonal vector
foreach (@{$.diagLR}) {
my ($text, $coords) = @$_;
my ($x, $y) = @$coords;
$text = ./_reverse($text);
while ($text =~ /($re)/g) {
my $off = _start(\$text,$1);
my $length = length($1);
$x += length($text);
$y += length($text);
$x--;
$y--;
push(@matches,
[length($1), $x-$off, $y-$off, -1, -1, \$_])
}
}
return @matches;
lib/Acme/Grep2D.pm view on Meta::CPAN
my ($length, $x, $y, $dx, $dy) = @$info;
my @result;
map {
push(@result, substr($.text->[$y], $x, 1));
$x += $dx;
$y += $dy;
} 1..$length;
return join('', @result);
}
sub _start {
my ($textRef, $one) = @_;
return pos($$textRef) - length($one);
}
=head2 B<text>
$textRef = $g2d->text();
Return an array reference to our internal text buffer. This
is for future use. Don't mess with the return, or bad things
( run in 0.270 second using v1.01-cache-2.11-cpan-0d8aa00de5b )