Use lookahead asseterions.
When you want to check if a string does not contain another substring, you can write:
/^(?!.*substring)/
You must check also the beginning and the end of line for this and word:
/^this(?!.*substring).*word$/
Another problem here is that you don't want to find strings, you want to find sentences (if I understand your task right).
So the solution looks like this:
perl -e '
local $/;
$_=<>;
while($_ =~ /(.*?[.])/g) {
$s=$1;
print $s if $s =~ /^this(?!.*substring).*word[.]$/
};'
Example of usage:
$ cat 1.pl
local $/;
$_=<>;
while($_ =~ /(.*?[.])/g) {
$s=$1;
print $s if $s =~ /^\s*this(?!.*regexp).*word[.]/i;
};
$ cat 1.txt
This sentence has the "regexp" word. This sentence doesn't have the word. This sentence does have the "regexp" word again.
$ cat 1.txt | perl 1.pl
This sentence doesn't have the word.