agr*_*gri -1 arrays perl string-matching
我有两个数组,一个包含来自错误日志的长字符串,第二个包含单词列表。我需要查找,其中一个词是否与任何错误字符串匹配。我想使用 index()。
我所拥有的是:@park 是一整页,一行一行。我剪下第 1 行并将其放入 $err1 @omit 是从文件中读取的单词列表。包含“Kein Zugriffsrecht”、“约束违反”等内容。我从数组中逐行获取(用 处理chomp())并将其放入 $fehler。
while (@park){
my $i = $#park;
$zeile1 = splice (@park,$i,1);
@foo1 = split(";", $zeile1);
$err1 = $foo1[1];
for my $b (0..$#omit){
$prob1 = 0;
$fehler = $omit[$b];
# $fehler="constraint violation";
$prob1 = index ($err1, $fehler);
...
}
Run Code Online (Sandbox Code Playgroud)
关键是,它$prob1 = index ($err1, $fehler); 总是给出 -1(未找到)。如果我设置$fehler为“违反约束”之类的东西,就像上面的注释行一样, index() 将给出正确的数字。什么可能导致这种行为?问候
一般来说,问题中的方法很好,详细信息如下。我不知道为什么你特别“想()使用指数”在这里,但这是很好,如果你真的只是想找到字符串的索引。我提供了一个更灵活的替代方案(正则表达式)。
while (@park) {
my $zeile1 = pop @park;
my @foo1 = split(";", $zeile1);
my $err1 = $foo1[0];
for my $b (0..$#omit) {
my $prob1 = 0;
my $fehler = $omit[$b];
if ($err1 =~ /$fehler/) {
$prob1 = $-[0]; # position of last match's start
...
}
...
}
}
Run Code Online (Sandbox Code Playgroud)
这会尝试从您的代码中保留详细信息。有关进一步的简化,请参见下文。关于问题中发布的代码的一些说明:
splice用于移除并返回最后一个字符;使用pop该
$foo1[1]是第二项,而不是所述的第一项;固定的
我不知道为什么你的index不起作用;也许@omit不包含您认为的内容?我使用了一个替代方案(正则表达式),你可以用它做更多的事情。但是,如果您实际上只需要匹配的位置,那么请修复index
循环结束@omit了它的索引。如果您不进一步使用该索引,则没有理由涉及它;循环遍历元素
foreach my $error (@omit) {
my $prob1 = 0;
if ($err1 =~ /$error/) {
$prob1 = $-[0]; # position of last match's start
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
(为了语言的一致性,我把fehler改成了英文)
循环的顶部也可以简化
while (my $row1 = pop @park) {
my @foo1 = split /;/, $row1;
...
}
Run Code Online (Sandbox Code Playgroud)
我更改了split's 参数的分隔符,以提醒它是一个正则表达式。为了一致性,我将zeile更改为英语(“row”)
代码中很少声明任何内容;也许您在更高的范围内声明?在尽可能小的范围内声明变量是有益的。未在循环外使用的变量应在分配时声明为正确
变量名的混合语言会让你发疯,会让读者痛苦(特别是如果他们两个都说得不够好)。两者都可以直接导致错误。为什么不选择一种语言来持续使用呢?
进一步的简化和清理可能是可能的,但我们不知道代码中进一步发生了什么
是@foo1用得较多?如果是,您是否可能希望每次都从它 ( ) 中删除前面的元素shift?
是怎么@omit处理的,有什么用$prob1?可以在一个语句中完成所有这些(可能涉及map),并且简洁可能有助于提高可读性
一些典型的数据是什么样的?这可能很好地解释了为什么index找不到子字符串