Scoping of lexical looks interesting perl6 -ne 'my %d; %d{ .words[1] }++; END { %d.sort.perl.say }'
as this could not work in perl5 perl -nE 'my $d =1; END { say $d//"default!" }' # gives default Btw, is there some option like perl -MO=Deparse -e .. in perl6? 01.09.2015, 17:03, "Jonathan Scott Duff" <d...@pobox.com>: > If you're not married to the "key : value" format, you could use this: > > scan +spam | perl6 -ne 'my %d; %d{.words[1]}++; END { .say for sort %d }' > > Here's another variation, but keeping your original format: > > scan +spam | perl6 -ne 'my %d; %d{.words[1]}++; END { say "$_.key() : > $_.value()" for sort %d }' > > And that *really* made me wish that this one would work: > > scan +spam | perl6 -ne 'my %d; %d{.words[1]}++; END { for %d.kv.sort -> > $k, $v { say "$k : $v" } }' # oops > > But the .kv method gives a list of key,value,key,value,etc. which doesn't > quite sort the way you want. > However, this one does work: > > scan +spam | perl6 -ne 'my %d; %d{.words[1]}++; END { for %(%d.sort).kv > -> $k, $v { say "$k : $v" } }' > > At the expensive of some extra punctuation and a little bit of clarity. > Personally, I'd just use the first thing I said. > > With strict being on as the default, It's too bad that one-liners aren't > treated as routines such that you can use self-declared parameters like so: > > scan +spam | perl6 -ne '%^d{.words[1]}++; END { .say for sort %d }' > > Then we could get both stricture and ease-of-use. Though, they'd have to be > auto-declared read-write as well for this to work. And though they'd be > parameters to this routine, the routine would probably be required to be > called with no parameters. And that would also mess with the call to .words > as $_ wouldn't be right ... but ... details, details ;) > > There may be the kernel of a good idea there if someone smarter than me wants > to think about it some more and make it workable. > > -Scott > > On Tue, Sep 1, 2015 at 2:10 AM, Matija Papec <mpapec2...@yandex.com> wrote: >> Not pretty, also you'll have to take care of -a switch, >> >> perl6 -ne 'our %d; %d{ .trim.split(/\s+/)[1] }++; END {say "$_: %d{$_}" for >> sort keys %d}' >> >> 31.08.2015, 17:25, "yary" <not....@gmail.com>: >> >>> Once in a while, our sysadmin tweaks something on an upstream mail server, >>> and asks us a few days later if our spam rate has changed. I invariably >>> whip up a perl5 one liner like this to get a daily spam count from my "mh" >>> mail folder: >>> >>> scan +spam|perl -naE '$d{$F[1]}++; END{say "$_: $d{$_}" for sort keys %d}' >>> >>> "scan +spam" spits out one line per message in my spam folder, with the >>> date in field 1. I'm using perl in an awk-like way, and taking advantage of >>> non-strictness to use a global %d without declaring it. >>> >>> What's a good concise "strict" Rakudo one-liner that works the same? In >>> particular, is there a Perl6 one-liner that works line-by-line (not >>> requiring reading all STDIN into memory) and doesn't require a variable >>> declaration? >>> >>> -y