App-yajg
view release on metacpan or search on metacpan
lib/App/yajg.pm view on Meta::CPAN
package App::yajg;
use 5.014000;
use strict;
use warnings;
no if $] >= 5.017011, warnings => 'experimental::smartmatch';
use utf8;
use Data::Dumper;
use JSON qw();
our $VERSION = '0.20';
sub MAX_RECURSION () {300}
{
my $inc = caller() ? $INC{ __PACKAGE__ =~ s/::/\//r . '.pm' } : undef;
my $at = join '|' => "\Q$0\E", '\(eval [0-9]++\)', '-[eE]', $inc ? "\Q$inc\E" : ();
my $re = qr/at (?:$at) line [0-9]++(?:\.|, <> (?:chunk|line) [0-9]++\.)/;
sub remove_at_line ($) { (shift // '') =~ s/$re//r }
}
sub warn_without_line { warn remove_at_line shift }
sub die_without_line { die remove_at_line shift }
sub size ($) {
ref $_[0] eq 'ARRAY' and @{ $_[0] } or ref $_[0] eq 'HASH' and %{ $_[0] }
}
sub values_ref ($) {
ref $_[0] eq 'ARRAY' ? @{ $_[0] }
: ref $_[0] eq 'HASH' ? (values %{ $_[0] })
: wantarray ? ()
: 0
}
sub read_next_json_file () {
local $/;
local $SIG{__WARN__} = \&warn_without_line;
while (<>) {
utf8::encode($_) if utf8::is_utf8($_);
$_ = eval { JSON::decode_json($_) };
warn "Failed to parse $ARGV: $@" if $@;
next unless ref $_;
return $_;
}
return;
}
sub parse_select ($;$) {
my $select = shift // return;
my $args = shift // {};
my @select_path;
# split by '.' exept '\.'
for (split /(?<!\\)\.+/ => $select) {
# now we can do unescape '\.'
s/\\\././g;
my $type = '';
# {....}
if (s/^\{(.*)\}$/$1/) {
$type = 'HASH';
if ($args->{'ignore_case'}) {
$type = 'HASH_IC';
$_ = lc($_);
}
}
# [....]
elsif (s/^\[(.*)\]$/$1/) {
$type = 'SLICE';
s/^\s*|\s*$//g;
# '2, 3, -2' -> [2, 3, 4]
my $list = [];
my $err;
for (split ',') {
s/^\s*|\s*$//g;
next unless length $_;
unless (m/^[+-]?[0-9]++$/) {
( run in 1.641 second using v1.01-cache-2.11-cpan-6de40a662fe )