With the Perl5 compiler the -n flag literally adds this around your code
before compiling:

    while ( <> ) {
        …
    }

Rakudo handles -n by transforming the AST (or the bytecode) into something
that loops.

Basically it is more like:

    … for lines

(In that it doesn't affect scoping or compile-time effects.)

So these are equivalent:

    seq 10 | perl6 -ne 'my Int $y += $_; END { print $y; }'
    seq 10 | perl6 -e '(my Int $y += $_; END { print $y; }) for lines'

(Note that I needed to surround it in parentheses so that it is one
statement.)

It could be argued that -n should turn your code into a lambda first.

    seq 10 | perl6 -e '{   my Int $y += $_; END { print $y; }   } for lines'
    10

Then you would need to use the 「state」 keyword more often.

    seq 10 | perl6 -e '{   state Int $y += $_; END { print $y; }   } for
lines'
    55



On Thu, Sep 26, 2019 at 4:31 PM Andy Bach <andy_b...@wiwb.uscourts.gov>
wrote:

> > Could the "-e" flag be limiting variable initializations to one?
>
> I don't think so. I recall the -n being shorthand for wrapping your -e
> program in
> while ( <> ) {
> # your program here
> }
>
> (-p just adds a continue "print" block, I believe), as folks would do cool
> tricks of writing their -e script to have an early close while curly,
> instead of, say, using END blocks
> $ seq 10 | perl -nE '   $y += $_} ;  { say $y; '
> 55
>
> Note: using "my"
> $ seq 10 | perl -nE ' my  $y += $_} ;  { say $y; '
> [crickets]
>
> gets you nothing, as $y is scoped to the -n while loop ;->
>
> ------------------------------
> *From:* William Michels <w...@caa.columbia.edu>
> *Sent:* Thursday, September 26, 2019 3:01 PM
> *To:* yary <not....@gmail.com>
> *Cc:* perl6 <perl6-us...@perl.org>; Andy Bach <andy_b...@wiwb.uscourts.gov>;
> Joseph Brenner <doom...@gmail.com>; Elizabeth Mattijsen <l...@dijkmat.nl>;
> Marc Chantreux <e...@phear.org>; Vittore Scolari <
> vittore.scol...@gmail.com>
> *Subject:* Re: anything faster than say [+] lines?
>
> Hi Yary,
>
> Honestly, I just tried re-writing the fastest StackOverflow answer
> (written in Perl 5) that I found below, in Perl 6. To write P5 as P6 I
> had to declare the variable $x with 'my'. Then I played around with a
> declaration restricting to "Int" type (to look at potential
> performance hits), just because well--with Perl 6--I could.
>
> >#Perl 5 code:
> >seq 1000000 | perl -lne '$x += $_; END { print $x; }'
>
> https://stackoverflow.com/a/47162173
>
> I'm guessing the answer as to 'why "my Int $y" isn't re-initialized
> every time'  in P6 is similar to the reason in P5? Could the "-e" flag
> be limiting variable initializations to one?
>
> Best Regards, Bill.
>
>
>
>
> On Thu, Sep 26, 2019 at 12:00 PM yary <not....@gmail.com> wrote:
> >
> > I see that Int/Num error, and also would like an explanation as to why
> "my Int $y" isn't re-initialized to Any each time through this loop
> >
> > $ seq 1000000 | perl6 -ne 'my Int $y += $_; END { print $y; }'
> >
> > Type check failed in assignment to $y; expected Int but got Num
> (500000500000e0)
> >
> >   in block <unit> at -e line 1
> >
> >
> > $ perl6 --version
> >
> > This is Rakudo Star version 2019.03.1 built on MoarVM version 2019.03
> >
> > implementing Perl 6.d.
> >
> >
> > -y
> >
> >
> > On Thu, Sep 26, 2019 at 2:24 PM William Michels via perl6-users <
> perl6-us...@perl.org> wrote:
> >>
> >> Thank you, Andy and Joseph!
> >>
> >>
> >> On Thu, Sep 26, 2019 at 8:47 AM Andy Bach <andy_b...@wiwb.uscourts.gov>
> wrote:
> >> >
> >> > >  Still, it's just "works for me":
> >> >
> >> > seq 1000000 | time perl6 -ne 'my $y += $_; END { print $y; }'
> >> >
> >> > I think that's still the wrong one - your missing the "Int"
> >> > $ seq 1000000 | perl6 -ne 'my Int $y += $_; END { print $y; }'
> >> > 500000500000
> >> >
> >> > though that works here, admittedly, my p6 is sort old
> >> > This is Rakudo version 2018.03 built on MoarVM version 2018.03
> >> > implementing Perl 6.c.
> >> >
> >> > I'm a little puzzled, I'd've thought the loop around the 'my Int $y'
> would redeclare a local $y each time.  Instead it behaves like:
> >> > $ time perl6 -e 'my Int $y = 0;for ( 1 .. 1000000) { $y += $_} ;  say
> $y; '
> >> >
> >> > (which is signficantly faster ;-)
> >> > 500000500000
> >> > real 0m1.229s
> >> > user 0m1.254s
> >> > sys 0m0.040s
> >> >
> >> > )
> >> > ________________________________
> >> > From: Joseph Brenner <doom...@gmail.com>
> >> > Sent: Wednesday, September 25, 2019 11:13 PM
> >> > To: William Michels <w...@caa.columbia.edu>
> >> > Cc: Marc Chantreux <e...@phear.org>; Vittore Scolari <
> vittore.scol...@gmail.com>; Elizabeth Mattijsen <l...@dijkmat.nl>; perl6 <
> perl6-us...@perl.org>
> >> > Subject: Re: anything faster than say [+] lines?
> >> >
> >> > Oh, wait.  I tried the wrong one-liner.  Still, it's just "works for
> me":
> >> >
> >> > seq 1000000 | time perl6 -ne 'my $y += $_; END { print $y; }'
> >> > 50000050000029.29user 0.06system 0:28.41elapsed 103%CPU
> >> > (0avgtext+0avgdata 76196maxresident)k
> >> > 63328inputs+0outputs (32major+15588minor)pagefaults 0swaps
> >> >
> >> >
> >> >
> >> > On 9/25/19, Joseph Brenner <doom...@gmail.com> wrote:
> >> > > I just gave that one-liner a try, but I didn't see that error:
> >> > >
> >> > >> seq 1000000 | time perl6 -e 'say [+] lines'
> >> > > 500000500000
> >> > > 28.70user 0.07system 0:28.29elapsed 101%CPU (0avgtext+0avgdata
> >> > > 74188maxresident)k
> >> > > 63424inputs+0outputs (32major+15409minor)pagefaults 0swaps
> >> > >
> >> > >
> >> > > perl6 --version
> >> > > This is Rakudo Star version 2019.03.1 built on MoarVM version
> 2019.03
> >> > > implementing Perl 6.d.
> >> > >
> >> > > uname -a
> >> > > Linux fandango 4.9.0-8-686 #1 SMP Debian 4.9.144-3 (2019-02-02) i686
> >> > > GNU/Linux
> >> > >
> >> > >
> >> > >
> >> > > On 9/24/19, William Michels via perl6-users <perl6-us...@perl.org>
> wrote:
> >> > >> I'm seeing a strange error. I started trying out Marc's original
> code,
> >> > >> then tried to adapt some Perl5-type solutions from SO to see how
> they
> >> > >> performed when re-written as Perl6. One thing I wanted to
> explicitly
> >> > >> test was how restricting to an "Int" type affected performance.
> >> > >>
> >> > >> However, I found a surprising result: a sequence of one-million
> Ints
> >> > >> throws an error, but a sequence of 999,999 Ints does not:
> >> > >>
> >> > >>> mbook:~ homedir$ seq 1000000 | time perl6 -e 'say [+] lines'
> >> > >>> 500000500000
> >> > >>>         4.81 real         4.86 user         0.20 sys
> >> > >>> mbook:~ homedir$ seq 1000000 | time perl6 -ne 'my $y += $_; END {
> print
> >> > >>> $y; }'
> >> > >>> 500000500000        4.88 real         5.06 user         0.19 sys
> >> > >>> mbook:~ homedir$ seq 1000000 | time perl6 -ne 'my Int $y += $_;
> END {
> >> > >>> print $y; }'
> >> > >>> Type check failed in assignment to $y; expected Int but got Num
> >> > >>> (500000500000e0)
> >> > >>>   in block <unit> at -e line 1
> >> > >>> 499999500000        4.77 real         4.97 user         0.19 sys
> >> > >>> mbook:~ homedir$ seq 999999 | time perl6 -ne 'my Int $y += $_;
> END {
> >> > >>> print
> >> > >>> $y; }'
> >> > >>> 499999500000        4.86 real         5.05 user         0.19 sys
> >> > >>> mbook:~ homedir$ perl6 -v
> >> > >>> This is Rakudo version 2019.07.1 built on MoarVM version 2019.07.1
> >> > >>> implementing Perl 6.d.
> >> > >>> mbook:~ homedir$
> >> > >>
> >> > >> Any comments or explanation appreciated,
> >> > >>
> >> > >> Best Regards, Bill.
> >> > >>
> >> > >>
> >> > >>
> >> > >>
> >> > >> On Tue, Sep 24, 2019 at 1:59 AM Marc Chantreux <e...@phear.org>
> wrote:
> >> > >>>
> >> > >>> hello,
> >> > >>>
> >> > >>> > > > > nice ... but when x is ~ 75440 (not always), there is a
> problem
> >> > >>> > > > What is x here?
> >> > >>> > > sorry. x is the arg of seq (number of lines).
> >> > >>> > That never happens on my laptop
> >> > >>>
> >> > >>> well.. so it's a problem with my station. nevermind :)
> >> > >>>
> >> > >>> thanks again for helping
> >> > >>> marc
> >> > >>
> >> > >
>

Reply via email to