in reply to Generating complex LDAP queries with Perl

while (my $cond = shift) { $filter = "($op $filter $cond)" if defined $cond; }

The while conditional will exit the loop if $cond is false or undefined so the subsequent test for defined is redundant, $cond will not be undefined inside the loop.   Note that if $cond also contains "0" or "" it will exit the loop.

Replies are listed 'Best First'.
Re^2: Generating complex LDAP queries with Perl
by grinder (Bishop) on Jul 18, 2009 at 09:34 UTC

    Just to situate the historical context, I added the if defined $cond much later on in the piece, when I added the IGNORE() function to change an AND() or an OR() into a no-op.

    The idea was to ensure that "valid1", "valid2", undef, "valid3" produces a syntactically correct query, without a fourth half-baked conditional creeping in there.

    But you know what? You're absolutely correct. Given the above and the following:

    sub _joiner { my $op = shift; my $filter = shift; while (my $cond = shift) { $filter = "($op $filter $cond)"; } return $filter; } my $filter = AND( "(a=1)", IGNORE( "(b=1)", "(b=2)", ), "(c=1)", );

    It does indeed produce (& (a=1) (c=1)). Thank-you very much for this insight, I appreciate it.

    • another intruder with the mooring in the heart of the Perl