Front page | perl.perl6.users |
Postings from May 2020
Re: Raku -npe command line usage
Thread Previous
|
Thread Next
From:
yary
Date:
May 8, 2020 18:03
Subject:
Re: Raku -npe command line usage
Message ID:
CAG2CFAaM_4Bb04RpaoJ_av6Dz7iu5rYV-b1LfD0dWgEX6hnqgw@mail.gmail.com
> perl6 -e 'lines() ==> grep /^WARN/ ==> sort() ==> join("\n") ==> say();'
that's neat too.
This is showed me that I didn't have a clear grasp of the feed operator ==>
vs the hyper-operator >>
Now I have learned/internalized that the feed operators pass along the
entire sequence (list?), whereas the hyper-operator passes items one at a
time. Hence "==> say" putting the results on one line, because "say" is
getting the entire list. And ">>.sort" not sorting, because sort would be
called once per item with only that single item to sort.
Boring hard-to-read solution not using any of those
raku -e'.say for sort grep *.starts-with(q[WARN]),lines' sample.log
-y
On Fri, May 8, 2020 at 1:20 PM William Michels <wjm1@caa.columbia.edu>
wrote:
> Maybe?
>
> perl6 -e 'lines() ==> grep /^WARN/ ==> sort() ==> join("\n") ==> say();'
>
> HTH, Bill.
>
>
> On Fri, May 8, 2020 at 9:10 AM Fernando Santagata
> <nando.santagata@gmail.com> wrote:
> >
> > raku -e'.say for lines() ==> grep(/^WARN/) ==> sort' sample.log
> >
> > is not very satisfying because for the "for" which breaks the flow.
> > OTOH this
> >
> > raku -e'lines().grep(/^WARN/).sort».say' sample.log
> >
> > doesn't use the feed operator and this
> >
> > raku -e'lines() ==> grep(/^WARN/) ==> sort() ==> say()' sample.log
> >
> > outputs a list on one line, not each line on its own. This one works,
> but it feels awkward:
> >
> > raku -e'lines() ==> grep(/^WARN/) ==> sort() ==> reduce({$^a ~ "\n" ~
> $^b}) ==> say()' sample.log
> >
> > On Fri, May 8, 2020 at 5:49 PM yary <not.com@gmail.com> wrote:
> >>
> >> All good ideas so far, in the "more than one way to do it" spirit, can
> use "state" instead of "my", since state only initializes 1st time it's hit.
> >>
> >> raku -ne 'state @i;@i.push($_) if .starts-with(q[WARN]); END .say
> for @i.sort' sample.log
> >>
> >> Or adapting Brad's answer with the feed operator for fun
> >>
> >> raku -e 'for lines() ==> grep /^WARN/ ==> sort() {.say}' sample.log
> >>
> >> Now, I didn't want to use 'map' in there, because of a habit of only
> using 'map' when I want the return values. When looping for side-effects
> only, like saying each value in a list, I want to use 'for'. UnFORtunately
> though I cannot find anything as clean looking as
> >>
> >> raku -e 'lines() ==> grep /^WARN/ ==> sort() ==> map *.say'
> sample.log
> >>
> >> reading entirely L-to-R which does NOT use map... ideas?
> >>
> >> -y
> >>
> >>
> >> On Fri, May 8, 2020 at 10:10 AM William Michels via perl6-users <
> perl6-users@perl.org> wrote:
> >> >
> >> > On Fri, May 8, 2020 at 5:16 AM WFB <wolfgang.banaston@gmail.com>
> wrote:
> >> > >
> >> > > Hi,
> >> > >
> >> > > I am trying to write an one-liner to go through all lines in a
> logfile and look for an certain key word, store the line and sort them
> before printing them out.
> >> > >
> >> > > My approach was:
> >> > > raku -ne "BEGIN {my @i }; @i.push($_); if $_ ~~ /^WARN/; END {
> @i.sort.say }"
> >> > > That does not work because @i does not exist in the if clause. I
> tried our @i as well with no luck.
> >> > >
> >> > > How can I store data that can be accessed in the END phaser? Or is
> there another way to archive it? TIMTOWTDI^^
> >> > >
> >> > > One hint I found was the variable $ and @ respectively. But those
> variables are created for each line new...
> >> > >
> >> > >
> >> > > I did not found a help or examples for -npe except raku -h. Is
> there more helpful stuff somewhere in doc.raku.org? If so I could'nt find
> it.
> >> > >
> >> > > Thanks,
> >> > > Wolfgang
> >> >
> >> > Hi Wolfgang,
> >> >
> >> > This is a first attempt at doing what you want: I'm sure it can be
> >> > shortened. Since one of your requirements is doing a sort on filtered
> >> > values stored in an array, I abandoned use of the "-ne" one-liner
> >> > flag, using "-e" and "for lines()" instead. I also used grep instead
> >> > of smart-matching:
> >> >
> >> > perl6 -e 'my @i; for lines() {if .grep(/^WARN/) -> ($s)
> >> > {@i.push($s)};}; .say for @i.sort;'
> >> >
> >> > Note: the "-> ($s)" section where I store grepped matches comes from a
> >> > Jonathan Worthington answer found here (thanks Jonathan!):
> >> >
> >> >
> stackoverflow.com/questions/58982745/raku-one-line-expression-to-capture-group-from-string
> >> >
> >> > I certainly would be interested to learn if there's a phaser solution
> >> > to this problem (and I also have a sneaking suspicion that Supply
> >> > might be useful here... ).
> >> >
> >> > HTH, Bill.
> >
> >
> >
> > --
> > Fernando Santagata
>
Thread Previous
|
Thread Next