The comma is more boring than that, it's simply separating the arguments to the sub "grep" - adding parend
.say for sort grep( *.starts-with(q[WARN]), lines ) grep as a sub takes a routine as the 1st arg, and the list to grep through after. -y On Fri, May 8, 2020 at 7:28 PM William Michels <w...@caa.columbia.edu> wrote: > >Boring hard-to-read solution not using any of those > > raku -e'.say for sort grep *.starts-with(q[WARN]),lines' sample.log > > Interesting! I don't think I've seen a comma used like that in a > one-liner. Also a very fast solution (thanks Brad!). > > Presumably the ",lines" tells raku/perl6 to run the preceding code on > input lines? > > TIA, Bill. > > On Fri, May 8, 2020 at 11:03 AM yary <not....@gmail.com> wrote: > > > > > 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 <w...@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.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 >