App-Greple-jq
view release on metacpan or search on metacpan
lib/App/Greple/jq.pm view on Meta::CPAN
if (length($dot) == 1) {
## using same capture group name is not a good idea
## so make sure to put just for the last one
$level = '?<level>' if $path eq '';
$start_with = qr/(?=\S)/;
}
qr{
^ (${level} $indent_re*) "$label_re": .* \n
(?:
## single line key-value pair
\g{-1} $indent_re $start_with .++ \n
|
## indented array/hash
\g{-1} $indent_re \S .* [\[\{] \n
(?: \g{-1} $indent_re \s .*+ \n) *+
\g{-1} $indent_re [\]\}] ,? \n
) *?
}xm;
}
};
push @prefix_re, $prefix_re if $prefix_re;
}
if ($level eq '') {
## refering named capture group causes error if it is not used
## so put dummy expression just to fail
push @prefix_re, qr/(?<level>(?!))?/;
lib/App/Greple/jq.pm view on Meta::CPAN
sub IN {
my %opt = @_;
my $target = delete $opt{&FILELABEL} or die;
my($label, $pattern) = @opt{qw(label pattern)};
my @prefix_re = $label =~ s/^((?:.*\.)?)// && prefix_regex($1);
$label =~ s/%/.*/g;
my($label_re, $pattern_re) = map re($_), $label, $pattern;
my $re = qr{
@prefix_re \K
^
(?(<level>) (?= \g{level} $indent_re \S ) ) # required level
(?<in> [ ]*) "$label_re": [ ]*+ # find given label
(?: . | \n\g{in} \s++ ) * # and look for ...
$pattern_re # pattern
(?: . | \n\g{in} (?: \s++ | [\]\}] ) ) * # and take the rest
}xm;
warn "$re\n" if $config{debug};
match_regions pattern => $re;
}
1;
__DATA__
define JSON-OBJECTS ^([ ]*)\{(?s:.*?)^\g{-1}\},?\n
option default --json-block --jq-filter
option --jq-filter --if='jq "if type == \"array\" then .[] else . end"'
option --json-block --block JSON-OBJECTS
define CALL_IN __PACKAGE__::IN(label=$<shift>,pattern=$<shift>)
option --AND --IN
( run in 0.227 second using v1.01-cache-2.11-cpan-87723dcf8b7 )