Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

Re: Smartmatch alternatives

by tobyink (Abbot)
on Dec 17, 2013 at 14:16 UTC ( #1067469=note: print w/ replies, xml ) Need Help??


in reply to Smartmatch alternatives

I needed just such a replacement when I went through my own distributions replacing ~~, so I wrote match::simple. It's a less confusing smart match operator. Syntax:

use match::simple; foobar() if $needle |M| $haystack;

The |M| bit is a pseudo-operator (a trick accomplished using somewhat crazy overloading of the bitwise-or operator). If you'd prefer to use it without all the crazy, match::simple also exports a match function:

use match::simple 'match'; foobar() if match $needle, $haystack;

match::simple has simpler, easier to remember rules than ~~, but it also comes bundled with match::smart which uses the same rules as ~~.

For given and when you could try Switcheroo or Switch::Plain, or dispatch tables, or long lists of elsif blocks.

use Moops; class Cow :rw { has name => (default => 'Ermintrude') }; say Cow->new->name


Comment on Re: Smartmatch alternatives
Select or Download Code
Re^2: Smartmatch alternatives
by cavac (Chaplain) on Dec 17, 2013 at 15:25 UTC
    Looks nice.

    Does the overloaded operator have any side effects on normal bitwise operations?
    "I know what i'm doing! Look, what could possibly go wrong? All i have to pull this lever like so, and then press this button here like ArghhhhhaaAaAAAaaagraaaAAaa!!!"

      It shouldn't do, unless your smart match operands also happen to be objects that override bitwise-or. (For example, Math::BigInt does.)

      The match($a, $b) function really is saner though. And faster for that matter. (Though the real smartmatch operator beats each hands down!)

      use v5.18; use match::simple -all; use Benchmark qw( cmpthese ); $::A = 3; $::B = [1 .. 5]; cmpthese(-1, { 'match' => q[ match($::A, $::B) ], 'M' => q[ $::A |M| $::B ], '~~' => q[ no warnings 'experimental::smartmatch'; $::A ~~ $::B + ], }); __END__ Rate M match ~~ M 11487/s -- -69% -99% match 36540/s 218% -- -97% ~~ 1420284/s 12265% 3787% --

      Anybody willing to provide a patch for an XS implementation of match::simple::match() would be likely to have it accepted. ;-)

      use Moops; class Cow :rw { has name => (default => 'Ermintrude') }; say Cow->new->name

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (6)
As of 2014-10-01 00:47 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (386 votes), past polls