http://www.perlmonks.org?node_id=565251


in reply to Re: Secret Perl Operators: the boolean list squash operator, x!! (grep)
in thread Secret Perl Operators: the boolean list squash operator, x!!

OK, so my example only used single-element lists, and most conditions were similar, so it was an insufficiently ornery problem to show that only the ternary and push are generically appropriate. Here’s an example to disqualify grep:

my $name = join '-', ( @prefix, ( $do_use_path ? split /:/, $path : () ), $name, $suffix, );

The only way I can think of to write that with grep is thus:

my $name = join '-', ( @prefix, ( map @$_, grep { $do_use_path } [ split /:/, $path ] ), $name, $suffix, );

D’oh, I see it now. Hmm…

That looks a lot worse than the ternary to me. grep is fine for problems with enough regularity, but when regularity is absent (here trivially achieved by having only a single conditional sublist, so there’s nothing to abstract), ternary/push/x!! is necessary – and of these, only x!! requires no unnecessary verbiage:

my $name = join '-', ( @prefix, ( split /:/, $path ) x!! $do_use_path, $name, $suffix, );

I wish modifiers could be applied to expressions, then this would be crystal clear to write:

my $name = join '-', ( @prefix, ( split /:/, $path ) if $do_use_path, $name, $suffix, );

Makeshifts last the longest.