Discussion:
komplex expressions in statement modifiers
(too old to reply)
Rainer Weikusat
2021-04-02 18:37:29 UTC
Permalink
The perl grep operator can be used to determine if some condition holds
for some elements of a list. In scalar context, it returns the number of
times the condition was true. This means it's semantically a bad fit for
finding a single element in a list because it always processes the
complete list. But it can be used as test expression for a statement
modifier ... so far, so bad.

Upon spending a time thinking through this, it dawned to be that eval {
} is syntactically an expression, hence

------
@a = qw(a b c d e);

while ($l = <STDIN>) {
chomp($l);
print("found $l\n") if eval { $_ eq $l and return 1 for @a };
}
-------

is valid Perl (which works, obviously).
George Bouras
2021-04-02 19:22:57 UTC
Permalink
Post by Rainer Weikusat
The perl grep operator can be used to determine if some condition holds
for some elements of a list. In scalar context, it returns the number of
times the condition was true. This means it's semantically a bad fit for
finding a single element in a list because it always processes the
complete list. But it can be used as test expression for a statement
modifier ... so far, so bad.
Upon spending a time thinking through this, it dawned to be that eval {
} is syntactically an expression, hence
------
@a = qw(a b c d e);
while ($l = <STDIN>) {
chomp($l);
}
-------
is valid Perl (which works, obviously).
use the clever equal ~~
Rainer Weikusat
2021-04-02 19:41:29 UTC
Permalink
Post by George Bouras
Post by Rainer Weikusat
The perl grep operator can be used to determine if some condition holds
for some elements of a list. In scalar context, it returns the number of
times the condition was true. This means it's semantically a bad fit for
finding a single element in a list because it always processes the
complete list. But it can be used as test expression for a statement
modifier ... so far, so bad.
Upon spending a time thinking through this, it dawned to be that eval {
} is syntactically an expression, hence
------
@a = qw(a b c d e);
while ($l = <STDIN>) {
chomp($l);
}
-------
is valid Perl (which works, obviously).
use the clever equal ~~
I'm not interested in the smart alec operator :->, not the least because
it (presumably forever) prevents Perl from getting a non-experimental
multiway conditional construct (something I'm using frequently)
Otto J. Makela
2021-04-06 04:50:35 UTC
Permalink
Rainer Weikusat <***@talktalk.net> wrote:

[...]
Post by Rainer Weikusat
is valid Perl (which works, obviously).
Thanks for this bit of strangeness, it caused me to look up the Perl
"secret operators" page:

https://metacpan.org/pod/distribution/perlsecret/lib/perlsecret.pod
--
/* * * Otto J. Makela <***@iki.fi> * * * * * * * * * */
/* Phone: +358 40 765 5772, ICBM: N 60 10' E 24 55' */
/* Mail: Mechelininkatu 26 B 27, FI-00100 Helsinki */
/* * * Computers Rule 01001111 01001011 * * * * * * */
Rainer Weikusat
2021-04-06 14:37:14 UTC
Permalink
Post by Otto J. Makela
[...]
Post by Rainer Weikusat
is valid Perl (which works, obviously).
Thanks for this bit of strangeness, it caused me to look up the Perl
https://metacpan.org/pod/distribution/perlsecret/lib/perlsecret.pod
There's nothing particularly strange in this construct: Any operator
can (obviously) be used as test expression for a
conditional. And any operator with a &-prototype would do here:

---------
sub judge (&)
{
&{$_[0]}
}

@a = qw(a b c d e);

while ($l = <>) {
chomp($l);
print("found $l\n") if judge { $_ eq $l and return 1 for @a };
}
---------

eval is just one behaving in this way which is already available.

NB: The page is somewhat interesting. But I don't generally care for
"brevity" (for its own sake) or "obscurity" (at all).

Loading...