Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical

Re^3: Bring back the smartmatch operator (but with sane semantics this time)!

by moritz (Cardinal)
on Jun 12, 2014 at 09:45 UTC ( #1089674=note: print w/replies, xml ) Need Help??

in reply to Re^2: Bring back the smartmatch operator (but with sane semantics this time)!
in thread Bring back the smartmatch operator (but with sane semantics this time)!

But, having dug in to Perl Guts more than I should have, I think that disallowing tied (and probably other magic) variables on the RHS, a built-in smart match would be able to reliably determine if the RHS is a number.

The problem is that Perl doesn't expose the concept "this scalar is a number" to the user (by design). Thus making a decision based on whether a scalar is a number is nearly always wrong.

A piece of code that already makes such a decision is the code that decides whether to warn on a numeric operation:

$ perl -wE 'say 0 + "1.2"' 1.2 $ perl -wE 'say 0 + "1.2.3"' Argument "1.2.3" isn't numeric in addition (+) at -e line 1. 1.2

So, what do I keep complaining about? A real problem are dual vars. Those aren't just a rare corner case that should be avoided, but for example the result from boolean operators:

$ perl -wE 'say 0 + !1' # no warning 0 $ perl -wE 'my $false = !1; say "<<$false>>"' # empty string! <<>>

So it's a number, but it's also an empty string. Should smart-matching against that be numeric or string comparison? My intuitive reaction is "string comparison", because $false doesn't round-trip when converted to a number and then to a string.

But you can also construct valid cases where round-tripping to a number is the wrong criterion; an example is if a user-supplied string is never used as a number, but happens to look like a number. You certainly don't want those values to try to coerce your own strings to numbers (and warn).

So, however you decide whether a scalar is number or a string for the purpose of comparision, I can point out a case where your decision is a big WTF. Which is precisely the reason that we have separate == and eq operators.

Whatever will be done about that, the string/number duality will remain a weakness of any Perl 5 smartmatch proposal.

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1089674]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (4)
As of 2022-12-08 22:53 GMT
Find Nodes?
    Voting Booth?

    No recent polls found