Perl:index() 不适用于 $array[$i] 之类的变量

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() 将给出正确的数字。什么可能导致这种行为?问候

zdi*_*dim 6

一般来说,问题中的方法很好,详细信息如下。我不知道为什么你特别“想()使用指数”在这里,但这是很好,如果你真的只是想找到字符串的索引。我提供了一个更灵活的替代方案(正则表达式)。

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找不到子字符串