嵌套循环实现列表元素匹配问题:列表无输出值求助
嘿,我来帮你揪出这段Perl代码没输出的问题,主要是几个关键错误在搞鬼:
1. 正则匹配方向完全搞反了
你的需求是用list1里的元素去匹配list2的元素(比如3155匹配3155785),但你写的if($list1[$i]=~/$list2[$j]/)完全搞反了逻辑——这行代码是拿list2的元素当正则表达式,去匹配list1的元素。举个例子,就是用"3155785"去匹配"3155",显然匹配不上,自然不会有输出。
正确的逻辑应该是检查list2的元素是否包含(或者以它开头)list1的元素,也就是:
if($list2[$j] =~ /$list1[$i]/)
如果是要求必须以list1元素开头(和你给出的示例场景一致),那要加上^锚定字符串开头,避免匹配到中间包含的情况:
if($list2[$j] =~ /^$list1[$i]/)
2. 循环变量$i和$j完全没更新
你初始化了$i=0和$j=0,但在嵌套的foreach循环里根本没给这两个变量递增。这意味着不管循环跑多少次,你始终只在比较$list1[0]和$list2[0],其他元素根本没机会被检查到。
其实Perl的foreach循环本身会把当前迭代的元素放到$_变量里,你完全可以不用下标,直接用命名变量来简化代码,彻底避免下标管理的错误:
foreach my $item1 (@list1) { foreach my $item2 (@list2) { if($item2 =~ /^$item1/) { print "$item1\n"; last; # 如果匹配到一个就停止当前list2的循环,避免重复输出同一个item1 } } }
3. 代码不完整(语法错误)
你贴的代码最后是print $list1[$i...,明显是截断了,就算前面的问题都修复,语法不完整也会导致脚本报错无法运行,要确保print语句完整,比如print $list1[$i], "\n";
修复后的完整示例代码
把这些问题都修正后,完整的可运行代码如下:
my @list1 = (3155, 3122, 3188); my @list2 = (3155785, 458999, 742199, 315520, 31550638, 4289965, 31221478, 1478596, 3122145, 31889963, 31889801); foreach my $item1 (@list1) { foreach my $item2 (@list2) { if ($item2 =~ /^$item1/) { # 前缀匹配,符合你的示例需求 print "$item1\n"; last; # 找到匹配就跳出内层循环,避免重复输出同一个list1元素 } } }
运行这段代码就会输出:
3155 3122 3188
内容的提问来源于stack exchange,提问作者steba
相关产品推荐
相关产品推荐

