in reply to Perl file name parsing - Regular expression

Are there any strings in your logfile array containing CSS which shouldn't be altered? If not, you could just go with

for (@filenames) { s/CSS//; } # or written with a statement modifier: # s/CSS// for @filenames;

You could run the above code over your array and check for false positives, and extend the regular expression if so.

Since your strings are tokens concatenated with a dot, of which the last is always ErrorLog, you could anchor your regular expression at the end with $ and remove CSS from the token preceeding the last two:

for (@filenames) { s{ # substitute CSS # the string CSS ( # and a capture consisting in \. # a literal dot, [^\.]+ # any number of non-dots, \. # another literal dot, ErrorLog # and the constant ErrorLog ) # (end of capture) $ # anchored at the end of the string } {$1}x; # against the capture above }

Or written more concisely with a terse explanation:

for (@filenames) { s/CSS(\.[^\.]+\.ErrorLog)$/$1/; # remove CSS from end of antepenul +timate token }

Perhaps more effective and faster, if you have only a few strings with CSS: look for CSS, if found, split, remove and join:

for (@filenames) { if (/CSS/) { my @t = split /\./; $t[-3] =~ s/CSS$//; $_ = join '.', @t; } }
perl -le'print map{pack c,($-++?1:13)+ord}split//,ESEL'

Replies are listed 'Best First'.
Re^2: Perl file name parsing - Regular expression
by rinkish85 (Novice) on May 30, 2017 at 06:32 UTC
    Thank you