Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Perl:index()赢得';不能使用像$array[$i]这样的变量_Arrays_Perl_String Matching - Fatal编程技术网

Arrays Perl:index()赢得';不能使用像$array[$i]这样的变量

Arrays Perl:index()赢得';不能使用像$array[$i]这样的变量,arrays,perl,string-matching,Arrays,Perl,String Matching,我有两个数组,一个包含错误日志中的长字符串,另一个包含单词列表。我需要查找是否有一个单词与任何错误字符串匹配。我想使用index() 我得到的是: @公园是一整页,一行一行。我删掉了第1行,把它放到$err1中 @省略是从文件中读取的单词列表。包含“Kein Zugriffsrecht”、“约束冲突”等。我从数组(用chomp()处理)中逐行获取数据,并将其放入$fehler中 while (@park){ my $i = $#park; $zeile1 = splice (@p

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

我得到的是: @公园是一整页,一行一行。我删掉了第1行,把它放到$err1中 @省略是从文件中读取的单词列表。包含“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);
...
}   

关键是,
$prob1=index($err1,$fehler)始终给出-1(未找到)。如果我将
$fehler
设置为类似于“约束冲突”的值,如上面注释的行中所示,index()将给出正确的数字。 什么会导致这种行为?
关于

一般来说,问题中的方法很好,细节如下。我不知道为什么您在这里特别“想使用index()”,但如果您确实只想找到子字符串的索引,那就没关系了。我提供了一个更灵活的选择(regex)

这会试图从代码中保留详细信息。有关进一步的简化,请参见下文。关于问题中公布的代码的一些注释:

  • splice
    用于删除并返回最后一个字符;使用
    pop
    进行此操作

  • $foo1[1]
    是第二项,而不是所述的第一项;固定的

  • 我不知道为什么你的
    索引不起作用;也许
    @omit
    不包含您认为它所包含的内容?我使用了另一种方法(regex),你可以用它做更多的事情。但是,如果您实际上只需要匹配的位置,那么请修复
    index

  • @omit
    上的循环在其索引上。如果你不使用该指数进一步向下,那么就没有理由涉及它;环绕元件

    foreach my $error (@omit) {
        my $prob1 = 0;
    
        if ($err1 =~ /$error/) { 
            $prob1 = $-[0];    # position of last match's start
            ...
        }
        ...
    }
    
    (为了语言的一致性,我将费勒改为英语)

  • 循环的顶部也可以简化

    while (my $row1 = pop @park) { 
        my @foo1 = split /;/, $row1;
        ...
    } 
    
    我更改了
    split
    的参数上的分隔符,以提醒它是一个正则表达式。为了保持一致性,我将zeile改为英语(“row”)

  • 代码中很少声明任何内容;也许你在更高的范围内声明?在尽可能紧凑的范围内声明变量是有益的。未在循环外使用的变量应在赋值时正确声明

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

进一步的简化和清理可能是可能的,但我们不知道代码后面会发生什么

  • @foo1
    使用得更多吗?如果是,您是否希望每次都从中删除前元素(
    shift

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

  • 一些典型的数据看起来像什么?这可以很好地解释为什么
    索引
    找不到子字符串


如果我的代码一半是德语,一半是英语,我会发疯的。你是怎么做到不把东西弄混的?尤其是
$err1
$fehler
。如果你在$work给我这个,我们可能会在周五下午进行一次不愉快的聊天不过,非常严肃地说,欢迎使用堆栈溢出。请花一点时间阅读并提供一份报告。基本上,请回答您的问题,并为
@park
@omit
提供一些示例数据。谢谢!:)
@omit
的元素是否有尾随的换行符?(即,您是否一直在调用
索引($err1,“约束冲突”)
?)您已经远远领先于您应该达到的位置。“我想使用index()”是您做错了什么的明确信号。(因为从来没有人真正想要使用索引)备份10个步骤,然后寻求帮助。@TLP完全可以理解这种情绪,但如果他们真的想要子字符串的索引,那么
index
就是工具(比启动正则表达式引擎快得多)如果你能提供一些样本数据——很少就能做到——那么我们就可以弄清楚为什么
index
fails首先非常感谢你的评论!“我想使用index()”的原因是,我只需要知道$err1是否包含我的字符串$fehler。如果没有,请执行操作;如果是,请转到下一个$err1条目。最后,我找到了index()不起作用的原因:包含搜索短语的文本文件有windows行结尾!因此chomp确实删除了\n,但由于某种原因没有删除\r,这导致了错误。如果我的问题不恰当,我想道歉——我喜欢perl,但我绝不是perl的传道者。我保证,下次我会更精确的@阿格里啊,窗户线的末端——一个常见的罪魁祸首!好发现。如果你只是想知道某个东西是否在字符串中,那么正则表达式最好地反映了这个意图;使用
索引
我认为您需要实际位置。(当然,你可以使用
索引
,只是它可能会误导读者——包括你自己几个月后忘记自己写了那段代码,更不用说代码的功能了。)除非“做点什么”涉及索引,在这种情况下,
index
是我认为最好的工具。@agri我觉得你的问题是合理的,尽管可能有点笨拙;但没关系,写一个好问题并不容易,这是你的第一个问题。我真的不明白为什么它两次得了-1,然后就关门了。因此,不要为此感到难过,只需写下一个更好的:)。明显缺少的一件事是一些样本数据;总是显示
while (my $row1 = pop @park) { 
    my @foo1 = split /;/, $row1;
    ...
}