我是Perl的新手,我正在尝试迭代数组的两个元素,每个元素中都有多个索引,并寻找匹配项。如果element2与element1匹配,我想打印两者并移动到element1中的下一个位置,继续循环寻找下一个匹配。如果我没有火柴,循环直到我找到火柴。这是我所拥有的:
@array = split(',',$row);
foreach $element1(@array[1])
{
foreach $element2(@array[2])
{
if($element1 == $element2)
{
print "1 = $element1 : 2 = $element2 n";
}
}
}
我没有得到匹配的输出。我已经尝试了多次迭代,并进行了不同的语法更改。当我这样做的时候,我可以得到两个元素:
foreach $element1(@array[1])
{
foreach $element2(@array[2])
{
print "1 = $element1 : 2 = $element2 n";
}
}
我想我可能没有正确地取消引用。如有任何指导或建议,我们将不胜感激。谢谢
您的脚本存在许多问题。简言之:
- 你应该始终使用严格和警告
- 数组索引从0开始,而不是从1开始
- 您得到的数组的元素是
$array[0]
,而不是@array[0]
。对于新的Perl程序员来说,这是一个常见的挫折。需要记住的是,sigil(变量名前面的符号)表示传递到表达式左侧的值的类型(例如$scalar
、@array
或%hash
),而不是右侧访问的数据结构的类型 - 正如@sp asic在对OP的评论中指出的那样,字符串比较是用
eq
而不是==
进行的 - 对数据结构的引用存储在标量中,您可以通过预处理原始数据结构的sigil来取消引用。如果
$foo
是对数组的引用,那么@$foo
将获得原始数组 - 当你找到匹配项时,你显然想打破你的内部循环,但你需要明确(对于将来研究这段代码的人,可能包括你自己)你要打破哪个循环
最关键的是,在用逗号分割另一个字符串(行)后,@array
将是一个字符串数组,因此不清楚为什么您希望能够将第一个和第二个位置的字符串视为可以循环的数组。我对您实际想做什么,以及您的输入和预期输出的实际情况有一些猜测,但我会等待您提供一些额外的信息,并在此期间将上面的信息作为一般指导,以及下面的代码的轻度修改版本。
use strict;
use warnings;
my @array = split(',', $row);
foreach my $element1 (@$array[0]) {
foreach my $element2 (@$array[1]) {
if ($element1 eq $element2) {
print "1 = $element1 : 2 = $element2n";
last;
}
}
}