App-CSelUtils
view release on metacpan or search on metacpan
lib/App/CSelUtils.pm view on Meta::CPAN
},
}, $_)
} @action_targets;
} elsif ($action =~ /\Aeval:(.+)/) {
my $string_code = $1;
my $compiled_code =
eval "package main; no strict; no warnings; sub { $string_code }"; ## no critic: BuiltinFunctions::ProhibitStringyEval
if ($@) {
die "Can't compile code in eval: $@\n";
}
for my $node (@action_targets) {
local $_ = $node;
$compiled_code->($node);
}
} elsif ($action eq 'count') {
if (@$actions == 1) {
$res->[2] = ~~@matches;
} else {
push @{ $res->[2] }, ~~@matches;
}
} elsif ($action eq 'print_as_string') {
push @{ $res->[2] }, map {$_->as_string} @action_targets;
} elsif ($action =~ /\Aprint_method:(.+)\z/) {
my @meths = split /\./, $1;
for my $node (@action_targets) {
my $node_res = $node;
for my $meth (@meths) {
eval { $node_res = $node_res->$meth };
if ($@) {
$node_res = undef;
last;
}
}
push @{ $res->[2] }, $node_res;
}
} elsif ($action =~ /\Aprint_func:(.+)\z/) {
no strict 'refs'; ## no critic: TestingAndDebugging::ProhibitNoStrict
my @funcs = split /\./, $1;
for my $node (@action_targets) {
my $node_res = $node;
for my $func (@funcs) {
eval { $node_res = &{$func}($node_res) };
if ($@) {
$node_res = undef;
last;
}
}
push @{ $res->[2] }, $node_res;
}
} elsif ($action =~ /\Aprint_func_or_meth:(.+)\z/) {
no strict 'refs'; ## no critic: TestingAndDebugging::ProhibitNoStrict
my @entries = split /\./, $1;
for my $node (@action_targets) {
my $node_res = $node;
for my $entry (@entries) {
my ($type, $name) = $entry =~ /\A(func|meth)::?(.+)\z/ or
return [400, "For action print_func_or_meth, ".
"specify func:FUNCNAME or meth:METHNAME"];
eval {
if ($type eq 'func') {
#use DD; say "func: $name(", DD::dump($node_res), ")";
$node_res = &{$name}($node_res);
} else {
#use DD; say "meth: $name on ", DD::dump($node_res);
$node_res = $node_res->$name;
}
};
if ($@) {
#warn $@;
$node_res = undef;
last;
}
}
push @{ $res->[2] }, $node_res;
}
} else {
return [400, "Unknown action '$action'"];
}
} # for $action
}
$res;
}
$SPEC{ddsel} = {
v => 1.1,
summary => 'Select Perl data structure elements using CSel (CSS-selector-like) syntax',
description => <<'_',
Note that this operates against Perl data structure, not Perl source code
elements (see <prog:ppisel> for that). File is Perl source code that defines
data structure, e.g.:
{
summary => 'This is a hash',
# this is an array inside a hash
array => [
1, 2, 3,
],
};
_
args => {
%foosel_args_common,
},
};
sub ddsel {
foosel(
@_,
code_read_tree => sub {
my $args = shift;
my $data;
if ($args->{file} eq '-') {
binmode STDIN, ":encoding(utf8)";
$data = eval join("", <>); ## no critic: BuiltinFunctions::ProhibitStringyEval
die if $@;
} else {
require File::Slurper;
$data = eval File::Slurper::read_text($args->{file}); ## no critic: BuiltinFunctions::ProhibitStringyEval
die if $@;
}
require Data::CSel::WrapStruct;
my $tree = Data::CSel::WrapStruct::wrap_struct($data);
( run in 0.492 second using v1.01-cache-2.11-cpan-d7a12ab2c7f )