Perl:如果两个元素匹配打印元素,则迭代直到匹配然后打印

时间:2016-08-03 03:30:52

标签: perl for-loop foreach

我是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";
  }
}

我以为我可能没有正确解除引用。任何指导或建议将不胜感激。感谢。

1 个答案:

答案 0 :(得分:1)

您的脚本存在许多问题。简言之:

  • 您应始终使用strictwarnings
  • 数组索引从0开始,而不是1。
  • 您获得的数组元素为initial catalog=myDB;UserId='MyUser';Password='abc;123';multipleactiveresultsets=True; ,而不是$array[0]。对于新的Perl程序员来说,这是一种常见的挫败感。要记住的是,sigil(变量名前面的符号)表示左侧传递的值的类型(例如@array[0]$scalar@array)表达式,而不是右侧访问的数据结构类型。
  • 正如@ sp-asic在OP的评论中指出的那样,字符串比较是使用%hash而不是eq执行的。
  • 对数据结构的引用存储在标量中,您可以通过预先添加原始数据结构的符号来取消引用。如果==是对数组的引用,则$foo会为您提供原始数组。
  • 当你找到匹配项时,你显然想要突破你的内部循环,但是你想要明确(对于将来会看到这段代码的人,可能包括你自己),这会使你和#39;重新突破。

最重要的是,@$foo在你用逗号分割另一个字符串(行)后会是一个字符串数组,所以你不清楚为什么你希望能够在第一个字符串中处理字符串和第二个位置作为您可以循环的数组。我猜测你实际上要做什么,以及你的输入和预期输出实际上是什么样的,但我会等你提供一些额外的信息,并将上述信息作为一般指导与此同时,还有下面代码的轻微修改版本。

@array