I had a problem where I wanted the longest string from a list. I didn’t want to sort because I wanted to do it with a single pass. (The comments show sorting through max
, which I was also avoiding).
# quote words, but with quote protection! my @strings = qww/ "This is a line" short "A very very long string maybe, certainly the longest" other not this a one or even 1 /; # If you give one thing to sort, it does that to both things and # compares with camp my ($longest) = @strings.sort( *.chars ).[*-1];
Instead, I decided to use the reduction operator with an operator that I make up (and limit to the lexical scope). The infix longest
takes two strings and returns the longest. I let the reduction take care of the rest:
my sub infix:{ $^a.chars > $^b.chars ?? $^a !! $^b } my $longest = [longest] @strings; say "Longest is 「$longest」";
Some commenters point out that calling .max
does the same thing. Looking in the Rakudo source for max, you see that it’s single pass too:
my $longest = @strings.max: *.chars; say "Longest is 「$longest」";
my $longest = @strings.max: *.chars ;
my ($longest) = max :by{$^a.chars <=> $^b.chars}, @strings;