in reply to Noodling with natural sorting in perl6
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.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Noodling with natural sorting in perl6
by thundergnat (Deacon) on Aug 20, 2010 at 18:28 UTC | |
by moritz (Cardinal) on Aug 20, 2010 at 20:26 UTC |