no
warnings
qw( threads recursion uninitialized numeric )
;
our
$VERSION
=
'1.699_011'
;
my
%rules
= (
'=='
=>
sub
{
$_
[0] ==
$_
[1] && looks_like_number (
$_
[0]) },
'!='
=>
sub
{
$_
[0] !=
$_
[1] && looks_like_number (
$_
[0]) },
'<'
=>
sub
{
$_
[0] <
$_
[1] && looks_like_number (
$_
[0]) },
'<='
=>
sub
{
$_
[0] <=
$_
[1] && looks_like_number (
$_
[0]) },
'>'
=>
sub
{
$_
[0] >
$_
[1] && looks_like_number (
$_
[0]) },
'>='
=>
sub
{
$_
[0] >=
$_
[1] && looks_like_number (
$_
[0]) },
'eq'
=>
sub
{ !
ref
(
$_
[0]) &&
$_
[0] eq
$_
[1] },
'ne'
=>
sub
{ !
ref
(
$_
[0]) &&
$_
[0] ne
$_
[1] },
'lt'
=>
sub
{ !
ref
(
$_
[0]) &&
$_
[0] lt
$_
[1] },
'le'
=>
sub
{ !
ref
(
$_
[0]) &&
$_
[0] le
$_
[1] },
'gt'
=>
sub
{ !
ref
(
$_
[0]) &&
$_
[0] gt
$_
[1] },
'ge'
=>
sub
{ !
ref
(
$_
[0]) &&
$_
[0] ge
$_
[1] },
'=~'
=>
sub
{ !
ref
(
$_
[0]) &&
$_
[0] =~
$_
[1] },
'!~'
=>
sub
{ !
ref
(
$_
[0]) &&
$_
[0] !~
$_
[1] },
);
sub
_compile {
my
(
$query
) =
@_
;
my
(
@f
,
@c
,
@e
,
$aflg
);
if
(
length
$query
) {
local
$@;
$aflg
= (
$query
=~ / :and /i );
for
(
split
( / :(?:and|or) /i,
$query
) ) {
if
( /(.+)[ ]+(=~|!~)[ ]+(.+)/ ) {
if
(
length
($2) &&
exists
(
$rules
{$2}) ) {
push
(
@f
,$1),
push
(
@c
,
$rules
{$2}),
push
(
@e
,
eval
(
"qr$3"
));
pop
(
@f
),
pop
(
@c
),
pop
(
@e
)
if
$@;
}
}
elsif
( /(.+)[ ]+(==|!=|<|<=|>|>=|eq|ne|lt|le|gt|ge)[ ]+(.+)/ ) {
if
(
length
($2) &&
exists
(
$rules
{$2}) ) {
push
(
@f
,$1),
push
(
@c
,
$rules
{$2}),
push
(
@e
,$3);
}
}
}
for
(
@e
) {
$_
=
undef
if
$_
eq
'undef'
;
}
}
( \
@f
,\
@c
,\
@e
,
$aflg
);
}
sub
_find_array {
my
(
$data
,
$params
,
$query
) =
@_
;
my
(
$field
,
$code
,
$expr
,
$aflg
) = _compile(
$query
);
if
(
scalar
@{
$field
} == 1 ) {
my
(
$f
,
$c
,
$e
) = (
$field
->[0],
$code
->[0],
$expr
->[0] );
if
(
$f
eq
'key'
) {
if
(
$params
->{
'getkeys'
} ) {
grep
$c
->(
$_
,
$e
), 0 .. $
}
elsif
(
$params
->{
'getvals'
} ) {
map
{
$c
->(
$_
,
$e
) ? (
$data
->[
$_
] ) : ()
} 0 .. $
}
else
{
map
{
$c
->(
$_
,
$e
) ? (
$_
=>
$data
->[
$_
] ) : ()
} 0 .. $
}
}
else
{
if
(
$params
->{
'getkeys'
} ) {
map
{
$c
->(
$data
->[
$_
],
$e
) ? (
$_
) : ()
} 0 .. $
}
elsif
(
$params
->{
'getvals'
} ) {
grep
$c
->(
$_
,
$e
), @{
$data
};
}
else
{
map
{
$c
->(
$data
->[
$_
],
$e
) ? (
$_
=>
$data
->[
$_
] ) : ()
} 0 .. $
}
}
}
elsif
(
scalar
@{
$field
} > 1 ) {
my
$ok
;
my
$is
=
$aflg
?
sub
{
$ok
= 1;
for
my
$i
( 0 .. $
$ok
=
$field
->[
$i
] eq
'key'
?
$code
->[
$i
](
$_
,
$expr
->[
$i
] )
:
$code
->[
$i
](
$data
->[
$_
],
$expr
->[
$i
] );
last
unless
$ok
;
}
return
;
} :
sub
{
$ok
= 0;
for
my
$i
( 0 .. $
$ok
=
$field
->[
$i
] eq
'key'
?
$code
->[
$i
](
$_
,
$expr
->[
$i
] )
:
$code
->[
$i
](
$data
->[
$_
],
$expr
->[
$i
] );
last
if
$ok
;
}
return
;
};
if
(
$params
->{
'getkeys'
} ) {
map
{
$is
->(),
$ok
? (
$_
) : ()
} 0 .. $
}
elsif
(
$params
->{
'getvals'
} ) {
map
{
$is
->(),
$ok
? (
$data
->[
$_
] ) : ()
} 0 .. $
}
else
{
map
{
$is
->(),
$ok
? (
$_
=>
$data
->[
$_
] ) : ()
} 0 .. $
}
}
else
{
();
}
}
sub
_find_hash {
my
(
$data
,
$params
,
$query
,
$obj
) =
@_
;
my
(
$field
,
$code
,
$expr
,
$aflg
) = _compile(
$query
);
if
(
scalar
@{
$field
} == 1 ) {
my
(
$f
,
$c
,
$e
) = (
$field
->[0],
$code
->[0],
$expr
->[0] );
if
(
$f
eq
'key'
) {
if
(
$params
->{
'getkeys'
} ) {
grep
$c
->(
$_
,
$e
),
$obj
->
keys
;
}
elsif
(
$params
->{
'getvals'
} ) {
map
{
$c
->(
$_
,
$e
) ? (
$data
->{
$_
} ) : ()
}
$obj
->
keys
;
}
else
{
map
{
$c
->(
$_
,
$e
) ? (
$_
=>
$data
->{
$_
} ) : ()
}
$obj
->
keys
;
}
}
elsif
(
$params
->{
'hfind'
} ) {
if
(
$params
->{
'getkeys'
} ) {
map
{
$c
->(
$data
->{
$_
}{
$f
},
$e
) ? (
$_
) : ()
}
$obj
->
keys
;
}
elsif
(
$params
->{
'getvals'
} ) {
map
{
$c
->(
$data
->{
$_
}{
$f
},
$e
) ? (
$data
->{
$_
} ) : ()
}
$obj
->
keys
;
}
else
{
map
{
$c
->(
$data
->{
$_
}{
$f
},
$e
) ? (
$_
=>
$data
->{
$_
} ) : ()
}
$obj
->
keys
;
}
}
elsif
(
$params
->{
'lfind'
} ) {
if
(
$params
->{
'getkeys'
} ) {
map
{
$c
->(
$data
->{
$_
}[
$f
],
$e
) ? (
$_
) : ()
}
$obj
->
keys
;
}
elsif
(
$params
->{
'getvals'
} ) {
map
{
$c
->(
$data
->{
$_
}[
$f
],
$e
) ? (
$data
->{
$_
} ) : ()
}
$obj
->
keys
;
}
else
{
map
{
$c
->(
$data
->{
$_
}[
$f
],
$e
) ? (
$_
=>
$data
->{
$_
} ) : ()
}
$obj
->
keys
;
}
}
else
{
if
(
$params
->{
'getkeys'
} ) {
map
{
$c
->(
$data
->{
$_
},
$e
) ? (
$_
) : ()
}
$obj
->
keys
;
}
elsif
(
$params
->{
'getvals'
} ) {
grep
$c
->(
$_
,
$e
),
$obj
->vals;
}
else
{
map
{
$c
->(
$data
->{
$_
},
$e
) ? (
$_
=>
$data
->{
$_
} ) : ()
}
$obj
->
keys
;
}
}
}
elsif
(
scalar
@{
$field
} > 1 ) {
my
$ok
;
if
(
$params
->{
'hfind'
} ) {
my
$is
=
$aflg
?
sub
{
$ok
= 1;
for
my
$i
( 0 .. $
$ok
=
$field
->[
$i
] eq
'key'
?
$code
->[
$i
](
$_
,
$expr
->[
$i
] )
:
$code
->[
$i
](
$data
->{
$_
}{
$field
->[
$i
] },
$expr
->[
$i
] );
last
unless
$ok
;
}
return
;
} :
sub
{
$ok
= 0;
for
my
$i
( 0 .. $
$ok
=
$field
->[
$i
] eq
'key'
?
$code
->[
$i
](
$_
,
$expr
->[
$i
] )
:
$code
->[
$i
](
$data
->{
$_
}{
$field
->[
$i
] },
$expr
->[
$i
] );
last
if
$ok
;
}
return
;
};
if
(
$params
->{
'getkeys'
} ) {
map
{
$is
->(),
$ok
? (
$_
) : ()
}
$obj
->
keys
;
}
elsif
(
$params
->{
'getvals'
} ) {
map
{
$is
->(),
$ok
? (
$data
->{
$_
} ) : ()
}
$obj
->
keys
;
}
else
{
map
{
$is
->(),
$ok
? (
$_
=>
$data
->{
$_
} ) : ()
}
$obj
->
keys
;
}
}
elsif
(
$params
->{
'lfind'
} ) {
my
$is
=
$aflg
?
sub
{
$ok
= 1;
for
my
$i
( 0 .. $
$ok
=
$field
->[
$i
] eq
'key'
?
$code
->[
$i
](
$_
,
$expr
->[
$i
] )
:
$code
->[
$i
](
$data
->{
$_
}[
$field
->[
$i
] ],
$expr
->[
$i
] );
last
unless
$ok
;
}
return
;
} :
sub
{
$ok
= 0;
for
my
$i
( 0 .. $
$ok
=
$field
->[
$i
] eq
'key'
?
$code
->[
$i
](
$_
,
$expr
->[
$i
] )
:
$code
->[
$i
](
$data
->{
$_
}[
$field
->[
$i
] ],
$expr
->[
$i
] );
last
if
$ok
;
}
return
;
};
if
(
$params
->{
'getkeys'
} ) {
map
{
$is
->(),
$ok
? (
$_
) : ()
}
$obj
->
keys
;
}
elsif
(
$params
->{
'getvals'
} ) {
map
{
$is
->(),
$ok
? (
$data
->{
$_
} ) : ()
}
$obj
->
keys
;
}
else
{
map
{
$is
->(),
$ok
? (
$_
=>
$data
->{
$_
} ) : ()
}
$obj
->
keys
;
}
}
else
{
my
$is
=
$aflg
?
sub
{
$ok
= 1;
for
my
$i
( 0 .. $
$ok
=
$field
->[
$i
] eq
'key'
?
$code
->[
$i
](
$_
,
$expr
->[
$i
] )
:
$code
->[
$i
](
$data
->{
$_
},
$expr
->[
$i
] );
last
unless
$ok
;
}
return
;
} :
sub
{
$ok
= 0;
for
my
$i
( 0 .. $
$ok
=
$field
->[
$i
] eq
'key'
?
$code
->[
$i
](
$_
,
$expr
->[
$i
] )
:
$code
->[
$i
](
$data
->{
$_
},
$expr
->[
$i
] );
last
if
$ok
;
}
return
;
};
if
(
$params
->{
'getkeys'
} ) {
map
{
$is
->(),
$ok
? (
$_
) : ()
}
$obj
->
keys
;
}
elsif
(
$params
->{
'getvals'
} ) {
map
{
$is
->(),
$ok
? (
$data
->{
$_
} ) : ()
}
$obj
->
keys
;
}
else
{
map
{
$is
->(),
$ok
? (
$_
=>
$data
->{
$_
} ) : ()
}
$obj
->
keys
;
}
}
}
else
{
();
}
}
sub
_stringify {
no
overloading;
"$_[0]"
}
sub
_numify {
no
overloading; 0 +
$_
[0] }
sub
_croak {
if
(
defined
$MCE::VERSION
) {
goto
&MCE::_croak
;
}
else
{
require
Carp
unless
$INC
{
'Carp.pm'
};
$SIG
{__DIE__} = \
&_die
;
local
$\ =
undef
;
goto
&Carp::croak
;
}
}
sub
_die {
if
(!
defined
$^S || $^S) {
if
( (
$INC
{
'threads.pm'
} && threads->tid() != 0) ||
$ENV
{
'PERL_IPERL_RUNNING'
}
) {
my
$_t
= Carp::longmess();
$_t
=~ s/\teval [^\n]+\n$//;
if
(
$_t
=~ /^(?:[^\n]+\n){1,7}\teval / ||
$_t
=~ /\n\teval [^\n]+\n\t(?:
eval
|Try)/ )
{
CORE::
die
(
@_
);
}
}
else
{
CORE::
die
(
@_
);
}
}
print
{
*STDERR
}
$_
[0]
if
defined
$_
[0];
($^O eq
'MSWin32'
)
? CORE::
kill
(
'KILL'
, -$$, $$)
: CORE::
kill
(
'INT'
, -
getpgrp
);
CORE::
exit
($?);
}
1;