Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?

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

Replies are listed 'Best First'.
Re^2: Smartmatch alternatives
by cavac (Deacon) 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?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1067469]
[Corion]: Oh yay. $project has faffed around for 2 years and now pushed a hasty 2 weeks solution into production without telling me. Of course, the new data also needs changes on my side to be processed correctly. Now they try to raise incidents against my ...
[Corion]: ... input systems to make the change outside of the organized project because I don't have ressources for the project to make the change.

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (6)
As of 2017-08-17 09:08 GMT
Find Nodes?
    Voting Booth?
    Who is your favorite scientist and why?

    Results (285 votes). Check out past polls.