Maybe my favorite example of the differential applications of `comb` vs
`split`. Below, sometimes you want to precisely tease-apart text, and
`comb` works towards that end. Other times you want to destructively
blast-away at text--eliminating the destractions--so you use `split`, until
you see the desired result:

~$ raku -e ' "122333444455555666666".comb(/ \d**2..* % <same> /).say;'
(22 333 4444 55555 666666)
~$ raku -e ' "122333444455555666666".split(/ \d**2..* % <same> /).say;'
(1     )
~$ raku -e ' "122333444455555666666".split(/ \d**2..* % <same> /,
:skip-empty).say;'
(1)

https://stackoverflow.com/a/69489459/7270649

Best, Bill.


On Mon, Nov 1, 2021 at 7:07 PM Patrick R. Michaud <pmich...@pobox.com>
wrote:

> This is a place where .comb() is likely much better than .split() --
> .comb()
> allows you to specify what you're wanting instead of what you're wanting to
> avoid:
>
>     $ raku -e "say sqrt(2).comb(/\d/).join(', ');"
>     1, 4, 1, 4, 2, 1, 3, 5, 6, 2, 3, 7, 3, 0, 9, 5, 1
>
> If you want only the first 10 digits, then:
>
>     $ raku -e "say sqrt(2).comb(/\d/)[^10].join(', ');"
>     1, 4, 1, 4, 2, 1, 3, 5, 6, 2
>
> Pm
>
>
> On Mon, Nov 01, 2021 at 06:55:40PM -0700, William Michels via perl6-users
> wrote:
> > You did great for not knowing Raku!
> >
> > ~$ raku -e "say sqrt(2).split(/\.|''/);"
> > ( 1  4 1 4 2 1 3 5 6 2 3 7 3 0 9 5 1 )
> > ~$ raku -e "say sqrt(2).split(/\.|''/).raku;"
> > ("", "1", "", "4", "1", "4", "2", "1", "3", "5", "6", "2", "3", "7", "3",
> > "0", "9", "5", "1", "").Seq
> > ~$ raku -e "say sqrt(2).split(/\.|''/, :skip-empty);"
> > (1 4 1 4 2 1 3 5 6 2 3 7 3 0 9 5 1)
> > ~$ raku -e "say sqrt(2).split(/\.|''/, :skip-empty).join(', ');"
> > 1, 4, 1, 4, 2, 1, 3, 5, 6, 2, 3, 7, 3, 0, 9, 5, 1
> >
> > I moved the sqrt(2) call to the head of the method chain, then visualized
> > elements using the `.raku` method (`.perl` works also, but don't tell
> > anyone). You can see an empty element at the beginning/end, as well as
> > where the decimal point used to reside. Including :skip-empty in your
> > `.split` call sets it to True, removing empty elements.
> >
> > For Mac/Linux people (swapped single/double quotes):
> >
> > ~$ raku -e 'say sqrt(2).split(/\.|""/);'
> > ( 1  4 1 4 2 1 3 5 6 2 3 7 3 0 9 5 1 )
> > ~$ raku -e 'say sqrt(2).split(/\.|""/).raku;'
> > ("", "1", "", "4", "1", "4", "2", "1", "3", "5", "6", "2", "3", "7", "3",
> > "0", "9", "5", "1", "").Seq
> > ~$ raku -e 'say sqrt(2).split(/\.|""/, :skip-empty);'
> > (1 4 1 4 2 1 3 5 6 2 3 7 3 0 9 5 1)
> > ~$ raku -e 'say sqrt(2).split(/\.|""/, :skip-empty).join(", ");'
> > 1, 4, 1, 4, 2, 1, 3, 5, 6, 2, 3, 7, 3, 0, 9, 5, 1
> >
> > HTH, Bill.
> >
> > On Sun, Oct 31, 2021 at 5:51 AM sisyphus <sisyphus...@gmail.com> wrote:
> > >
> > >
> > >
> > > On Sun, Oct 31, 2021 at 10:10 PM ToddAndMargo via perl6-users <
> > perl6-users@perl.org> wrote:
> > >>
> > >> On 10/31/21 01:43, Shlomi Fish wrote:
> > >>
> > >> >
> > >> >> ("" ~ sqrt(2)).comb().grep(* ne ".").map(+*)
> > >> > (1 4 1 4 2 1 3 5 6 2 3 7 3 0 9 5 1)
> > >>
> > >> Cool!
> > >>
> > >> my Int @x = ("" ~ sqrt(2)).comb().grep(* ne ".").map(+*)
> > >> [1 4 1 4 2 1 3 5 6 2 3 7 3 0 9 5 1]
> > >>
> > >> Is there a way to set how many digits I get?
> > >
> > >
> > > In perl we can do:
> > > C:\>perl -e "@x = split(/\.|/, sqrt(2)); print for @x";
> > > 14142135623731
> > > C:\>perl -e "@x = split(/\.|/, sprintf('%.7g', sqrt(2))); print for
> @x";
> > > 1414214
> > > C:\>perl -e "@x = split(/\.|/, sprintf('%.8g', sqrt(2))); print for
> @x";
> > > 14142136
> > >
> > > But the same split() expression is unacceptable to Raku.
> > > Closest I could get with that approach:
> > >
> > > C:\>raku -e "say split(/\.|''/, sqrt 2);"
> > > ( 1  4 1 4 2 1 3 5 6 2 3 7 3 0 9 5 1 )
> > >
> > > C:\_32>raku -e "say split(/\.|''/, sprintf('%.5g', sqrt 2));"
> > > ( 1  4 1 4 2 )
> > >
> > > It's that additional space between the first 2 digits that has me beat.
> > > (I don't know raku at all.)
> > >
> > > Cheers,
> > > Rob
> > >
> > >
>

Reply via email to