I like this formulation Fernando posted (removed a set of parens not needed
with method calls)

    raku -e'lines.grep(/^WARN/).sort».say' sample.log

It is clean, all left-to-right, and doesn't use "map" for its side-effects
only.
Putting the feed operator back in where it would work–have to keep the
hyper-operator–

    raku -e'(lines() ==> grep(/^WARN/) ==> sort)».say' sample.log

-y


On Fri, May 8, 2020 at 12:10 PM Fernando Santagata <
nando.santag...@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....@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-us...@perl.org> wrote:
>> >
>> > On Fri, May 8, 2020 at 5:16 AM WFB <wolfgang.banas...@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
>

Reply via email to