我有以下代码,我正在检查排除的数组中的特定变量位置。除了一个之外的所有数组元素都可以正常工作(abc / def / libraries / linux_3.2.60-1 + deb7u3.dsc) 。当我提供这个元素作为我的位置时,它的打印“位置不被排除”,即使它被排除在外。
如何让我的代码获取此元素以及排除?
use strict;
use warnings;
my @excluded = (
"xyz/efg/headers/",
"abc/def/libraries/jni-mr.h",
"abc/def/libraries/linux_3.2.60-1+deb7u3.dsc",
);
my $location = "abc/def/libraries/linux_3.2.60-1+deb7u3.dsc";
my $badpath = 0;
foreach (@excluded) {
# -- Check if location is contained in excluded array
if ($location =~ /^$_/) {
$badpath = 1;
print "location is excluded : $location \n";
}
}
if (! $badpath) {
print "location is not excluded : $location \n";
}
期望的输出:
location is excluded : abc/def/libraries/linux_3.2.60-1+deb7u3.dsc
当前输出:
location is not excluded : abc/def/libraries/linux_3.2.60-1+deb7u3.dsc
答案 0 :(得分:2)
使用quotemeta($text)
或\Q$text\E
(在双引号内或正则表达式文字中)创建与$text
的值匹配的模式。换句话说,使用
if ($location =~ /^\Q$_\E/)
而不是:
if ($location =~ /^$_/)
答案 1 :(得分:0)
看起来您打算通过正则表达式定义排除项,但是您还没有在这些正则表达式中正确转义正则表达式元数据。对于你的失败案例,导致它失败的元模型是加号(+
),这是大多数正则表达式(包括Perl)中的一个或多个乘数,但你需要按字面意思匹配它。
此外,我建议将^
锚从循环移动到每个单独的正则表达式,这将使代码更灵活,因为您可以选择不锚定某些排除如果你想要正则表达式。
此外,您应该使用qr()
构造,它允许您预编译正则表达式,节省CPU。
此外,此要求适合使用grep()
。
use strict;
use warnings;
my @excluded = (
qr(^xyz/efg/headers/),
qr(^abc/def/libraries/jni-mr\.h),
qr(^abc/def/libraries/linux_3\.2\.60-1\+deb7u3\.dsc),
);
my $location = 'abc/def/libraries/linux_3.2.60-1+deb7u3.dsc';
# -- Check if location is contained in excluded array
my $badpath = scalar(grep($location =~ $_, @excluded )) >= 1 ? 1 : 0;
if ($badpath) {
print "location is excluded : $location \n";
} else {
print "location is not excluded : $location \n";
}