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
找不到子字符串
我有两个数组,一个包含错误日志中的长字符串,另一个包含单词列表。我需要查找其中一个单词是否与任何错误字符串匹配。我想使用 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
找不到子字符串