Re: Raku -npe command line usage
On Fri, May 8, 2020 at 6:10 PM Fernando Santagata wrote: > raku -e'lines() ==> grep(/^WARN/) ==> sort() ==> reduce({$^a ~ "\n" ~ > $^b}) ==> say()' sample.log > and the reduce call can be written more compactly: reduce({"$^a\n$^b"}) -- Fernando Santagata
Re: Raku -npe command line usage
Maybe? perl6 -e 'lines() ==> grep /^WARN/ ==> sort() ==> join("\n") ==> say();' HTH, Bill. On Fri, May 8, 2020 at 9:10 AM Fernando Santagata 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 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 >> wrote: >> > >> > On Fri, May 8, 2020 at 5:16 AM WFB 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
Re: Raku -npe command line usage
Ooops forgot the sort... let's golf with the hyper-operator again... raku -ne'push my @i: $_ if .starts-with: q[WARN]; END @i.sort>>.say' sample.log -y On Fri, May 8, 2020 at 1:10 PM yary wrote: > ooh neat! I didn't know. Indeed this works. Thanks Sean! > > raku -ne'push my @i: $_ if .starts-with: q[WARN]; END .say for @i' > sample.log > > -y > > > On Fri, May 8, 2020 at 1:04 PM Sean McAfee wrote: > >> On Fri, May 8, 2020 at 6:53 AM Brad Gilbert wrote: >> >>> So together that would be: >>> >>> raku -ne 'BEGIN my @i; @i.push($_) if /^WARN/; END .say for @i.sort' >>> >> >> Or alternately the main body of the loop can be written: >> >> (my @i).push($_) if /^WARN/; >> >> Or even: >> >> push my @i: $_ if /^WARN/; >> >> It's so nice how Raku essentially compiles the body of these file loops >> into a little subroutine so that the "my" declaration only occurs once, >> unlike how Perl 5 just textually wraps the loop with "while (<>) {" and "}" >> which makes the declaration occur on every iteration. >> >> I originally figured this out when I idly worked up a classic >> word-frequency-count one-liner: >> >> raku -ne '++(my %freq){$_} for m:g/\w+/; END .say for >> %freq.antipairs.sort.reverse' file ... >> >>
Re: Raku -npe command line usage
ooh neat! I didn't know. Indeed this works. Thanks Sean! raku -ne'push my @i: $_ if .starts-with: q[WARN]; END .say for @i' sample.log -y On Fri, May 8, 2020 at 1:04 PM Sean McAfee wrote: > On Fri, May 8, 2020 at 6:53 AM Brad Gilbert wrote: > >> So together that would be: >> >> raku -ne 'BEGIN my @i; @i.push($_) if /^WARN/; END .say for @i.sort' >> > > Or alternately the main body of the loop can be written: > > (my @i).push($_) if /^WARN/; > > Or even: > > push my @i: $_ if /^WARN/; > > It's so nice how Raku essentially compiles the body of these file loops > into a little subroutine so that the "my" declaration only occurs once, > unlike how Perl 5 just textually wraps the loop with "while (<>) {" and "}" > which makes the declaration occur on every iteration. > > I originally figured this out when I idly worked up a classic > word-frequency-count one-liner: > > raku -ne '++(my %freq){$_} for m:g/\w+/; END .say for > %freq.antipairs.sort.reverse' file ... > >
Re: Raku -npe command line usage
On Fri, May 8, 2020 at 6:53 AM Brad Gilbert wrote: > So together that would be: > > raku -ne 'BEGIN my @i; @i.push($_) if /^WARN/; END .say for @i.sort' > Or alternately the main body of the loop can be written: (my @i).push($_) if /^WARN/; Or even: push my @i: $_ if /^WARN/; It's so nice how Raku essentially compiles the body of these file loops into a little subroutine so that the "my" declaration only occurs once, unlike how Perl 5 just textually wraps the loop with "while (<>) {" and "}" which makes the declaration occur on every iteration. I originally figured this out when I idly worked up a classic word-frequency-count one-liner: raku -ne '++(my %freq){$_} for m:g/\w+/; END .say for %freq.antipairs.sort.reverse' file ...
Re: Raku -npe command line usage
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 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 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 >
Re: Raku -npe command line usage
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 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 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
Re: Raku -npe command line usage
On Fri, May 8, 2020 at 5:16 AM WFB 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.
Re: Raku -npe command line usage
The 「@i」 is defined within the 「BEGIN」 block, so it is scoped to the 「BEGIN」 block. If you didn't want that, don't use a *block* with 「BEGIN」. BEGIN my @i; Also you wrote the 「if」 wrong. There shouldn't be a 「;」 before the 「if」. You also don't need to use 「$_ ~~ 」 with 「/^WARN/」 as that would automatically happen. @i.push($_) if /^WARN/; You probably also want the lines to be written each to to their own lines. So you probably want one of the following. @i.sort.map( *.say ) .say for @i.sort Again you don't need to use a block with 「END」 either. So together that would be: raku -ne 'BEGIN my @i; @i.push($_) if /^WARN/; END .say for @i.sort' --- That said, I wouldn't use -n in this case. raku -e 'lines.grep( /^WARN/ ).sort.map( *.say )' Currently regexes are a bit slow. You can use 「.starts-with」 instead to make it faster. raku -e 'lines.grep( *.starts-with(q[WARN]) ).sort.map( *.say )' (Note that 「 'abc' 」 is short for 「 q'abc' 」 which can also be written as 「 q[abc] 」. The latter is useful on the command line so that it doesn't interfere with the command processor quoting rules.) On Fri, May 8, 2020 at 7:16 AM WFB 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 >