Yes, but you need to group the alternations, and for efficiency, the grouping should be non-capturing:
#! perl
use strict;
use warnings;
for (
'ASQWERFD.YYxxxx.W12345.XYZQW.D072413.csv',
'ASQWERFD.YYxxxx.W12345.XYZQW.D072413.txt',
'ASQWERFD.YYxxxx.W12345.XYZQW.D072413.dat',
'ASQWERFD.YYxxxx.W12345.KMHYT.D072413.csv',
'ASQWERFD.YYxxxx.W12345.XYZQA.D072413.csv',
)
{
if (/ .{10,} (?: XYZQW | KMHYT) .* \. (?: csv | txt) $ /ix)
{
print "Matched $_\n";
}
else
{
print "Ignoring $_\n";
}
}
Output:
11:57 >perl 673_SoPW.pl
Matched ASQWERFD.YYxxxx.W12345.XYZQW.D072413.csv
Matched ASQWERFD.YYxxxx.W12345.XYZQW.D072413.txt
Ignoring ASQWERFD.YYxxxx.W12345.XYZQW.D072413.dat
Matched ASQWERFD.YYxxxx.W12345.KMHYT.D072413.csv
Ignoring ASQWERFD.YYxxxx.W12345.XYZQA.D072413.csv
11:57 >
On grouping, see Regular Expressions:
WARNING: Once Perl sees that you need one of $&, $`, or $' anywhere in the program, it has to provide them for every pattern match. This may substantially slow your program. Perl uses the same mechanism to produce $1, $2, etc, so you also pay a price for each pattern that contains capturing parentheses. (To avoid this cost while retaining the grouping behaviour, use the extended regular expression (?: ... ) instead.)
Note that I’ve also used /x for improved readability.
Hope that helps,
|