从Perl中的配置文件生成“下一个ifs”

从Perl中的配置文件生成“下一个ifs”,perl,loops,configuration,Perl,Loops,Configuration,Perl中有些东西我不知道如何编码,我可以请求您的帮助吗 基本上,我正在尝试使用一个配置文件,其中包含一个数组、一个散列或任何包含异常的类型,我希望在主程序循环的下一个if中使用这些异常 例如: 我的程序是这样的: while(<>) { next if /regex1/; next if /regex2/; next if /regexN/; } 如何在代码中轻松地完成这项工作?注释所在的位置,即从数组中添加所有下一个if 谢谢! 这是非常低效的!不要这样

Perl中有些东西我不知道如何编码,我可以请求您的帮助吗

基本上,我正在尝试使用一个配置文件,其中包含一个数组、一个散列或任何包含异常的类型,我希望在主程序循环的下一个if中使用这些异常

例如:

我的程序是这样的:

while(<>) {
    next if /regex1/;
    next if /regex2/;
    next if /regexN/;
}
如何在代码中轻松地完成这项工作?注释所在的位置,即从数组中添加所有下一个if

谢谢! 这是非常低效的!不要这样做。您应该预先编译模式。 您可以使用另一个循环来迭代while中的所有模式。如果为while循环指定了一个标签,则可以直接下一个标签

my %conf = ( exceptions => [ 'regex1', 'regex2', 'regexN', ], );

OUTER: while (<DATA>) {
    foreach my $re (@{ $conf{exceptions} }) {
        next OUTER if m/$re/;
    }
    print;
}

__DATA__
regex0
regex1
regex2
regexA
regexB
regexN
请注意,do'./config_file.conf'非常安全。您应该使用模块来读取配置文件格式。这将使您的代码更具可移植性,并确保您可能无法控制的代码不会被执行。例如,您可以使用或。

这是非常低效的!不要这样做。您应该预先编译模式。 您可以使用另一个循环来迭代while中的所有模式。如果为while循环指定了一个标签,则可以直接下一个标签

my %conf = ( exceptions => [ 'regex1', 'regex2', 'regexN', ], );

OUTER: while (<DATA>) {
    foreach my $re (@{ $conf{exceptions} }) {
        next OUTER if m/$re/;
    }
    print;
}

__DATA__
regex0
regex1
regex2
regexA
regexB
regexN

请注意,do'./config_file.conf'非常安全。您应该使用模块来读取配置文件格式。这将使您的代码更具可移植性,并确保您可能无法控制的代码不会被执行。例如,您可以使用,或者。

嗯,它似乎可以使用:

next if grep /$_/, @{$conf{exceptions}};
不知道它是否真的干净


还有其他想法吗?

嗯,它似乎与:

next if grep /$_/, @{$conf{exceptions}};
不知道它是否真的干净


还有其他想法吗?

除了现有的答案之外,我可能会扩展它,根据我的输入编译一个正则表达式:

#!/usr/bin/env perl
use strict;
use warnings;

my %conf = ( exceptions => [ 'regex1', 'regex2', 'regexN', ], );

my $match = join ( "|", @{$conf{exceptions}} ); 
   $match = qr/\b$match\b/;

print "Using regex of: ",$match,"\n";

while ( <DATA> ) {
   next if /$match/;
   print;
}

__DATA__
regex0
regex1
regex2
regexA
regexB
regexN
这比grep有一个特别的优势,grep将迭代整个regex列表,即使它很早就匹配了。不过,如果你有少量的模式,这并不重要

对于奖励积分,您可能希望根据“命中”的可能性进行排序,以便更早地找到匹配项。默认情况下,按长度排序可以做到这一点


请注意-我使用\b单词边界锚,这可能不是您想要做的,因为除了现有答案之外,您还使用regex作为输入

,我可能会将其展开以根据输入编译regex:

#!/usr/bin/env perl
use strict;
use warnings;

my %conf = ( exceptions => [ 'regex1', 'regex2', 'regexN', ], );

my $match = join ( "|", @{$conf{exceptions}} ); 
   $match = qr/\b$match\b/;

print "Using regex of: ",$match,"\n";

while ( <DATA> ) {
   next if /$match/;
   print;
}

__DATA__
regex0
regex1
regex2
regexA
regexB
regexN
这比grep有一个特别的优势,grep将迭代整个regex列表,即使它很早就匹配了。不过,如果你有少量的模式,这并不重要

对于奖励积分,您可能希望根据“命中”的可能性进行排序,以便更早地找到匹配项。默认情况下,按长度排序可以做到这一点


注意-我使用\b单词边界锚,这可能不是您想要做的,因为您使用regex作为输入

不要像simbabque和olivierg建议的那样反复编译模式

my %conf = ( exceptions => [ 'regex1', 'regex2', 'regexN', ], );

my $exceptions_re = join '|', @{ $conf{exceptions} };
$exceptions_re = qr/$exceptions_re/;

while (<DATA>) {
   next if /$re/;
   print;
}


不要像simbabque和olivierg建议的那样反复编译模式

my %conf = ( exceptions => [ 'regex1', 'regex2', 'regexN', ], );

my $exceptions_re = join '|', @{ $conf{exceptions} };
$exceptions_re = qr/$exceptions_re/;

while (<DATA>) {
   next if /$re/;
   print;
}


如果有很多行需要检查,那么将它们编译成一个大模式可能会更便宜。非常感谢,我不担心我可以控制外部块的下一个,谢谢!顺便说一句,我在表格中也使用了grep,这实际上非常糟糕。它每行最多编译三个模式,而不是编译一个甚至三个模式。@ikegami我知道。我今天没想清楚。但是它被接受了,所以我不能再删除它了。如果你有很多行要检查,那么将它们编译成一个大模式可能会更便宜。非常感谢,我不知道我可以控制下一个外部块,谢谢!顺便说一句,我在表格中也使用了grep,这实际上非常糟糕。它每行最多编译三个模式,而不是编译一个甚至三个模式。@ikegami我知道。我今天没想清楚。但是它被接受了,所以我不能再删除它了。@simbabque如果grep{$\u=~/$\ u/}@{$conf{exceptions};,这相当于next;,所以这完全是错误的。它也会不必要地检查每一个图案。@ThisSuits是黑色的不像我刚才说的那样,我今天真的没想清楚。抱歉。@simbabque如果grep{$\u=~/$\ u/}@{$conf{exceptions};,这相当于下一步;,所以这完全是错误的。它也会不必要地检查每一个图案。@ThisSuits是黑色的不像我刚才说的那样,我今天真的没想清楚。对不起,请复习新答案。我的没有错,但效率很低。如果您不接受,我将不胜感激,这样我可以删除它,因为它具有误导性。请查看新的答案。我的没有错,但效率很低。如果您不接受,我将不胜感激,这样我可以删除它,因为它具有误导性。
my $exceptions_re = join '|', map quotemeta, @{ $conf{exceptions} };