Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options

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]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (4)
As of 2018-06-23 14:37 GMT
Find Nodes?
    Voting Booth?
    Should cpanminus be part of the standard Perl release?

    Results (125 votes). Check out past polls.