in reply to File name regex

(Warning: more Regexp::Assemble pimping ahead).

Assuming you do not really care about those captures, if I "unroll" the patterns, it looks like you're interested matching against the following patterns:

^\d{8}\.ilf ^\d{8}_\d+\.ilf ^\d{8}\.sht ^\d{8}\s\d+\.sht

Using the assemble script from the above module, or something like

my $re = Regexp::Assemble->new(flags=>'i')->add(@list)

it produces the following pattern:

^\d{8}(?:\.(?:ilf|sht)|\s\d+\.sht|_\d+\.ilf)

... which looks roughly like that the other people came up with manually. If you do need the captures, the pattern becomes

^\d{8}(?:(\s(\d+))\.sht|(_(\d+))\.ilf|\.(?:ilf|sht))

in which case you can perform the match and get the captures with something like

my @result = map {defined} ($file =~ /$re/);

• another intruder with the mooring in the heart of the Perl