The Perl Toolchain Summit 2025 Needs You: You can help 🙏 Learn more

our $AUTHORITY = 'cpan:SCHWIGON';
# ABSTRACT: Magic functions available inside filter conditions
$Data::DPath::Filters::VERSION = '0.60';
use strict;
use constant {
HASH => 'HASH',
ARRAY => 'ARRAY',
SCALAR => 'SCALAR',
};
our $idx;
our $p; # current point
sub affe {
return $_ eq 'affe' ? 1 : 0;
}
sub idx { $idx }
sub size()
{
no warnings 'uninitialized';
return -1 unless defined $_;
# speed optimization: first try faster ref, then reftype
# ref
return scalar @$_ if ref $_ eq ARRAY;
return scalar keys %$_ if ref $_ eq HASH;
return 1 if ref \$_ eq SCALAR;
# reftype
return scalar @$_ if Scalar::Util::reftype $_ eq ARRAY;
return scalar keys %$_ if Scalar::Util::reftype $_ eq HASH;
return 1 if Scalar::Util::reftype \$_ eq SCALAR;
# else
return -1;
}
sub key()
{
no warnings 'uninitialized';
my $attrs = defined $p->attrs ? $p->attrs : {};
return $attrs->{key};
}
sub value()
{
no warnings 'uninitialized';
return $_;
}
sub isa($) {
my ($classname) = @_;
no warnings 'uninitialized';
#print STDERR "*** value ", Dumper($_ ? $_ : "UNDEF");
return $_->isa($classname) if Scalar::Util::blessed $_;
return undef;
}
sub reftype() {
return Scalar::Util::reftype($_);
}
sub is_reftype($) {
no warnings 'uninitialized';
return (Scalar::Util::reftype($_) eq shift);
}
1;
=pod
=encoding UTF-8
=head1 NAME
Data::DPath::Filters - Magic functions available inside filter conditions
=head1 API METHODS
=head2 affe
Mysterious test function. Will vanish. Soon. Or will it really? No,
probably not. I like it. :-)
Returns true if the value eq "affe".
=head2 idx
Returns the current index inside array elements.
Please note that the current matching elements might not be in a
defined order if resulting from anything else than arrays.
=head2 size
Returns the size of the current element. If it is an array ref it
returns the number of elements, if it is a hash ref it returns number of keys,
if it is a scalar it returns 1, everything else returns -1.
=head2 key
If it is a hashref returns the key under which the current element is
associated as value. Else it returns undef.
This gives the key() function kind of a "look back" behaviour because
the associated point is already after that key.
=head2 value
Returns the value of the current element.
=head2 isa
Frontend to UNIVERSAL::isa. True if the current element is_a given
class.
=head2 reftype
Frontend to Scalar::Util::reftype.
Returns Scalar::Util::reftype of current element $_. With this you can
do comparison by yourself with C<eq>, C<=~>, C<~~> or whatever in
filter expressions.
=head2 is_reftype($EXPECTED_TYPE)
Frontend to Scalar::Util::reftype.
Checks whether Scalar::Util::reftype of current element $_ equals the
provided argument $EXPECTED_TYPE and returns true/false.
=head1 AUTHOR
Steffen Schwigon <ss5@renormalist.net>
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2024 by Steffen Schwigon.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut
__END__
# sub parent, Eltern-Knoten liefern
# nextchild, von parent und mir selbst
# previous child
# "." als aktueller Knoten, kind of "no-op", daran aber Filter verknüpfbar, löst //.[filter] und /.[filter]
# IDEA: functions that return always true, but track stack of values, eg. last taken index
#
# //AAA/*[ _push_idx ]/CCC[ condition ]/../../*[ idx == pop_idx + 1]/
#
# This would take a way down to a filtered CCC, then back again and take the next neighbor.