问题是负后视和行首都^是零宽度匹配。所以当你说
“从字符串的开头开始”
然后说
“检查它前面的字符不是#”
...您实际上在字符串开始之前检查了字符。当然不是#,因为它什么都不是。
请改用前瞻。这有效:
use strict;
use warnings;
my @list = qw( apple banana cherry);
my $comb_tlist = join ("|", @list);
my $string1 = 'include $(dir)/apple';
my $string2 = '#include $(dir)/apple';
if( $string1 =~ /^(?!#).*($comb_tlist)/) { say "String1"; }
if( $string2 =~ /^(?!#).*($comb_tlist)/) { say "String2"; }
请注意,您在示例代码中犯了四个严重错误。首先,您使用string1which 是一个裸词,它将被解释为一个字符串。其次,您声明@list但随后使用@tlist. 第三,你不(似乎)使用
use strict;
use warnings;
这些 pragma 可能会通知您您的错误,如果没有它们,您很可能不会收到关于前两个严重错误的警告。没有充分的理由不使用它们,所以在将来这样做。
四、申报
$string1 = "include $(dir)/apple";
意味着您尝试$(在字符串中插入变量。$是双引号字符串中的元字符,因此您应该使用单引号:
my $string1 = 'include $(dir)/apple';