Win8 Strawberry 5.30.3.1 (64) Tue 07/26/2022 6:46:09
C:\@Work\Perl\monks
>perl
use strict;
use warnings;
my $input = q/saxyzzy Monday Saturday Thursday Saturday Sat Sun Mon Tu
+e Wen Th/;
my $re =
join "|",
map ".*\\b($_\\S*)",
map m/(..)/,
qw/monday tuesday wednesday thursday friday saturday sunday/
;
print "\$re '$re' \n";
print join '.', $input =~ m/^(?|$re)\b(?{ print "$1\n" })(*FAIL)/i;
^Z
$re '.*\b(mo\S*)|.*\b(tu\S*)|.*\b(we\S*)|.*\b(th\S*)|.*\b(fr\S*)|.*\b(
+sa\S*)|.*\b(su\S*)'
Mon
Monday
Tue
Wen
Th
Thursday
Sat
Saturday
Saturday
saxyzzy
Sun
This can be avoided with more complete automatic pattern generation, but some false positives will remain, e.g., 'satu' for Saturday.
File sort_weekdays_2.pl:
False-positive day-name matches can be entirely avoided with a custom regex:
my $rx_days = qr{ (?i) # custom patterns
.*? \K \b mo (?: n (?: day)?)? |
.*? \K \b tu (?: e (?: s (?: day)?)?)? |
.*? \K \b we (?: d (?: nes day)?)? |
.*? \K \b th (?: u (?: r (?: s (?: day)?)?)?)? |
.*? \K \b fr (?: i (?: day)?)? |
.*? \K \b sa (?: t (?: ur day)?)? |
.*? \K \b su (?: n (?: day)?)?
}xms;
My somewhat arbitrary use of \K in this regex means the extraction regex must be changed. This works:
$test =~ m{ \A $rx_days \b (?{ push @got, ${^MATCH} }) (*FAIL) }xmsp;
Use of the ${^MATCH} match variable (and /p modifier) can be avoided by use of the
substr $test, $-[0], $+[0]-$-[0]
expression.
Give a man a fish: <%-{-{-{-<
|