use strict; use warnings; my $data = join '', ; my $file; while ($data =~ m/\@include (".*?"|'.*?'|(?:[^\s\\]|\\ )+)/g) { $file = $1; $file =~ s/["'\\]+//g; print "$file\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?