問題は、負の後読みと行頭^
が両方ともゼロ幅の一致であることです。だからあなたが言うとき
「文字列の先頭から開始」
そして言う
「その前の文字が # でないことを確認してください」
...実際には、文字列の開始前の文字をチェックします。それは何もないので、もちろんそう#
ではありません。
代わりに先読みを使用してください。これは機能します:
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"; }
サンプル コードで 4 つの重大な間違いを犯したことに注意してください。まずstring1
、文字列として解釈されるベアワードである which を使用します。次に、宣言し@list
てから使用します@tlist
。第三に、あなたは使用していません(使用していないようです)
use strict;
use warnings;
これらのプラグマによってエラーが通知される可能性がありますが、プラグマがなければ、最初の 2 つの重大なエラーについて警告されなかった可能性があります。それらを使用しない正当な理由はないので、将来的には使用してください。
第四に、宣言
$string1 = "include $(dir)/apple";
文字列内の変数を補間しようとすることを意味します$(
。$
は二重引用符で囲まれた文字列のメタ文字であるため、単一引用符を使用する必要があります。
my $string1 = 'include $(dir)/apple';