Perl: index() 不能使用 $array[$i] 这样的变量

Perl: index() won't work with variable like $array[$i]

我有两个数组,一个包含错误日志中的长字符串,另一个包含单词列表。我需要查找其中一个单词是否与任何错误字符串匹配。我想使用 index().

我有的是: @park 是一整页,一行一行。我剪下第 1 行并将其放入 $err1 @omit 是从文件中读取的单词列表。包含“Kein Zugriffsrecht”、“constraint violation”等。我从数组中逐行获取(用 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);
...
}   

重点是,$prob1 = index ($err1, $fehler); 总是 给出 -1(未找到)。如果我将 $fehler 设置为类似“违反约束”的值,就像上面的注释行一样,index() 将给出正确的数字。 什么可能导致这种行为? 此致

总的来说,问题中的方法很好,下面有详细说明。我不知道你为什么在这里特别“想使用 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
            ...
        }
        ...
     }
} 

这试图从您的代码中保留详细信息。请参阅下面的进一步简化。关于问题中发布的代码的一些注释:

  • splice用于去掉和return最后一个字符;为此使用 pop

  • $foo1[1]second 项目,而不是第一个;固定

  • 我不知道为什么你的 index 不起作用;也许 @omit 不包含您认为的内容?我使用替代方法(正则表达式),您可以用它做更多事情。但是,如果您实际上只需要匹配的位置,那么请修复 index

  • @omit 的循环结束了它的索引。如果您不进一步使用该索引,则没有理由涉及它;遍历元素

    foreach my $error (@omit) {
        my $prob1 = 0;
    
        if ($err1 =~ /$error/) { 
            $prob1 = $-[0];    # position of last match's start
            ...
        }
        ...
    }
    

    (我把 fehler 改成了英语,为了语言的一致性)

  • 循环的顶部也可以简化

    while (my $row1 = pop @park) { 
        my @foo1 = split /;/, $row1;
        ...
    } 
    

    我更改了 split 参数的分隔符,以提醒它是一个正则表达式。为了保持一致性,我将 zeile 更改为英语(“行”)

  • 很少在代码中声明任何东西;也许你在更高的范围内声明?在尽可能小的范围内声明变量是有益的。不在循环外使用的变量应该在分配时正确声明

  • 变量名的混合语言会让你发疯,也会让 reader 痛苦不堪(特别是如果他们两种语言都说得不够好)。两者都可能直接导致错误。为什么不选择一种语言来始终如一地使用?

进一步的简化和清理很可能是可能的,但我们不知道代码中进一步的内容

  • @foo1用的多吗?如果是,您是否希望每次都从它 (shift) 中删除 前面的元素?

  • @omit是怎么处理的,$prob1有什么用?可以在一条语句中完成所有这些操作(可能涉及 map),简洁可能有助于提高可读性

  • 一些典型的数据是什么样的?这可能很好地解释了为什么 index 找不到子字符串