Thanks, you've been the most helpful one so far. Sadly, the above solution also doesn't solve the problem properly. However, I managed to combine it with another of the regular expressions that was proposed, plus some code for better resolving the escape sequences in the string, plus a better way of removing the quotes (only from the ends of the string - not from everywhere).
Here is what I managed to come up with:
use strict;
use warnings;
while (my $data = <DATA>)
{
if ($data =~ /\@include/i)
{
$data =~ m/\@include\s+('^'+'|"^"+"|.+?(?<!\\))\s/gi;
my $fname = $1;
$fname =~ s/\\(rnt'"\\ )/"qq|\\$1|"/gee;
$fname =~ s/^"(.*)"$/$1/s or
$fname =~ s/^'(.*)'$/$1/s;
print "File name: <$fname>\n";
}
}
__DATA__
#some "random stuff" @include "some file" did you parse that?
#more 'random' stuff @include 'another file' you sure?
#and more random stuff @include yet\ another\ file positive?
#@Include file
# @include "\"another one\"" hmmm...
# some stuff
The "if" is there because, as I've mentioned above, I have to do some other processing of the lines, too. This code mostly works although, as you say, it doesn't handle properly file names containing escaped quotes.
Perhaps I should give up the idea of parsing this in some clever way and just process the part after the "@include" character-by-character?
In reply to Re^2: Help with a regular expression for file name parsing
by bontchev
in thread Help with a regular expression for file name parsing
by bontchev
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |