Below I'll make some suggestion of how you could take advantage of some nice Perl 6 features, and write more idiomatic Perl 6 code:
my $filename = shift @*ARGS or die "You need to pass in a filename.";
Instead I usually write
sub MAIN($filename) { # rest of the mainline code here }
The MAIN sub does the command line parsing for you, and also gives an automatic usage message.
rx/ \w+ [<punct> \w+]* /
This also be written as rx/ [\w+] ** <punct> /. Here ** is the general quantifier, a ** 4 matches 4 a's, a ** <punct> matches an arbitrary number of a's, separated by punctuation.
sub natural_cmp ($a, $b) { my ($first, $second) = ($a, $b); my ($one, $two) = ($first, $second).map({ .=subst(/(\d+)/, -> $/{ sprintf( "%s%c%s", 0, $0.chars, $0) }, :g).lc }); return ($one cmp $two); }
If you leave out the = in .=subst, no in-place modification takes place; instead the modified value is returned, and the original variable remains untouched.
So you can write
sub natural_cmp ($a, $b) { my ($one, $two) = ($a, $b).map(*.subst(/(\d+)/, -> $/{ sprintf( "%s%c%s", 0, $0.chars, $0) }, :g).lc); return $one cmp $two; }
If you happen to need a copy, you can also say sub mysub($a is copy, $b is copy), so you don't need to come up with more variable names.
In reply to Re: Noodling with natural sorting in perl6
by moritz
in thread Noodling with natural sorting in perl6
by thundergnat
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |