我一直在寻找解决问题的方法,而哈希似乎是在阅读了几篇文章之后的答案,但我不确定如何根据我的要求实现这一点,是否有人可以建议如何甚至是更好的选择?
在我的代码中,变量$host
是根据数据库中的值设置的。我遍历这些值,每次更改$host
的值。
我想丢弃某些类型的主机名,并确定要在用户可配置的文件中读取哪些要丢弃的主机,该文件包含该排除的Perl正则表达式。即配置文件有一行
EXCLUDE=\d+DAT\d+,\d+INF\d+
然后我想建立Perl正则表达式匹配(逻辑OR),即
if ( $host =~ m/\d+DAT\d+/ || $host =~ m/\d+INF\d+/ ) {
# do something
}
目前我的代码是硬连线的,如上例所示,但是如何在读取配置文件后动态构造Perl正则表达式?
我已将配置文件读入数组并从那里开始。上面的代码需要像这样结束:
if ($exclude clause) {
# do something
}
这就是我从数组中实现读取的方法:
for ($i = 1; $i < @conf; $i++) {
$exclude_clause .= "$host =~/" . @conf[$i] . "/ || ";
}
$exclude_clause =~ s/ \|\| $//;
问题是引用$host
中的$exclude_clause
。除$host
之外,我的正则表达式字符串已构建好。
答案 0 :(得分:0)
我建议采用不同的方法,不要求你建立一个大的Regex字符串,然后评估它。相反,使用List::MoreUtils
模块的any
函数接受一个代码块,为列表的每个成员计算它,并在块返回true时返回true,对于至少一个条目名单。例如:
use List::MoreUtils qw{ any };
if ( any { $host =~ $_ } @conf ) {
# do something
}
在传递给any
的代码块中,临时变量$_
包含列表中的当前条目。这样你就可以避免首先构建正则表达式。
答案 1 :(得分:0)
我认为您应该将完整的正则表达式存储在配置文件中,但如果需要,它可以是一组逗号分隔的替代。
您可以使用qr//
构造来构建正则表达式:
my $exc1 = "\d+DAT\d+"; # Read from configuration file
my $ecc2 = "\d+INF\d+";
my $rex1 = qr/$exc1/;
my $rex2 = qr/$exc2/;
...populate $host...
if ($host =~ $rex1 || $host =~ $rex2)
{
...exclude $host...
}
else
{
...include $host...
}
或者,您可以构建一个正则表达式:
my $exc1 = "\d+DAT\d+"; # Read from configuration file
my $ecc2 = "\d+INF\d+";
my $rex = qr/$exc1|$exc2/;
...populate $host...
if ($host =~ $rex)
{
...exclude $host...
}
else
{
...include $host...
}
单个正则表达式可以根据您的喜好构建尽可能多的替代排除正则表达式片段。当然,如果文件中的值是:
EXCLUDE=\d+DAT\d+|\d+INF\d+
然后,假设正则表达式字符串被读入$exc
,您的代码将再次简化:
my $exc = "\d+DAT\d+|\d+INF\d+"; # Read from file
my $rex = qr/$exc/;
...populate $host...
if ($host =~ $rex)
{
...exclude $host...
}
else
{
...include $host...
}