I got the point for //. Another question is about calling the method sort with a code block. I can understand
@x .= sort({ ... }); But I don't quite understand why this form also works. @x .= sort: { ... }; I look into the documentation for infix ":", https://docs.perl6.org/routine/: <https://docs.perl6.org/routine/:> , and it explains something like this: Used as an argument separator just like infix , and marks the argument to its left as the invocant. That turns what would otherwise be a function call into a method call. substr('abc': 1); # same as 'abc'.substr(1) Infix : is only allowed after the first argument of a non-method call. In other positions, it's a syntax error. How does the above explanation related to the case in hand @x .= sort: { ... }; ? Is sort an invocant? Or I miss something. Regards Xin > On Jun 9, 2018, at 12:44 PM, Brandon Allbery <allber...@gmail.com> wrote: > > More precisely, at that point you have a bunch of numbers, but possibly not > as many as expected if some of the components weren't numeric (or all of > them, as when there are files present that aren't the expected logs). Which > means some or all of those variables will be undefined instead of numbers. > The // replaces those with the following value (0), so they do something > sensible when sorted instead of producing warnings. > > On Sat, Jun 9, 2018 at 11:40 AM Xin Cheng <xinchen...@gmail.com > <mailto:xinchen...@gmail.com>> wrote: > This is very interesting. But I wonder how it works. I can understand the > first line > > my ($month, $day, $year, $hour, $minute, $second) = .comb(/\d+/); > > Which extract the variables from $_. What is the second line doing, it is > very concise. > > ($year // 0, $month // 0, $day // 0, $hour // 0, $minute // 0, > $second // 0, $_); > > Could somebody explain in some more words.? What does // do? Why it sorts > the array? > > Regards > > Xin > >> On Jun 9, 2018, at 12:51 AM, Timo Paulssen <t...@wakelift.de >> <mailto:t...@wakelift.de>> wrote: >> >> That's unnecessarily long and complicated, here's how you can do it much >> easier: >> >> @x.sort: { >> my ($month, $day, $year, $hour, $minute, $second) = .comb(/\d+/); >> ($year // 0, $month // 0, $day // 0, $hour // 0, $minute // 0, >> $second // 0, $_); >> } >> >> Trying it on some input data: >> >> cimtrak.log.06-08-2018_16:07:39.zip >> cimtrak.log.06-08-2018_17:07:39.zip >> cimtrak.log.07-08-2018_06:07:39.zip >> cimtrak.log.07-08-2018_16:07:39.zip >> cimtrak.log.12-08-2016_06:07:39.zip >> cookies >> asbestos >> fire engine >> perl6 >> butterflies >> >> results in: >> >> asbestos >> butterflies >> cookies >> fire engine >> perl6 >> cimtrak.log.12-08-2016_06:07:39.zip >> cimtrak.log.06-08-2018_16:07:39.zip >> cimtrak.log.06-08-2018_17:07:39.zip >> cimtrak.log.07-08-2018_06:07:39.zip >> cimtrak.log.07-08-2018_16:07:39.zip >> >> This is the schwartzian transform that was mentioned in another mail. >> why it wasn't actually shown, i have no clue :) >> >> Hope that helps >> - Timo > > > > -- > brandon s allbery kf8nh sine nomine associates > allber...@gmail.com <mailto:allber...@gmail.com> > ballb...@sinenomine.net <mailto:ballb...@sinenomine.net> > unix, openafs, kerberos, infrastructure, xmonad http://sinenomine.net > <http://sinenomine.net/>