我希望有人可以帮助我。我是Perl的新手,并且通常从我编写的一些小脚本中获得了一些好的结果,但是,我仍然坚持使用我正在处理的新脚本的嵌套while循环。
我放在一起的脚本执行两个mysql select语句,然后将结果放入单独的数组中。然后我想从第一个数组中的第一个元素检查第二个数组中的所有结果。然后移动到第一个数组中的第二个元素,并检查秒数组中的所有结果,依此类推。
该脚本的目标是在第一个数组中找到一个IP地址,并在第二个数组中查看它适合的子网......
我发现发生的事情是,脚本只在第一个数组上的第一个元素上运行,第二个数组上的所有元素都会停止。
以下是perl脚本的摘录 - 如果有人能指出我正确的方向,我会非常感激。
my @ip_core_wan_field;
while ( @ip_core_wan_field = $wan_core_collection->fetchrow_array() ) {
my $coreipAddr = @ip_core_wan_field[1];
my @ip_wan_field;
while ( @ip_wan_field = $wan_collection->fetchrow_array() ) {
my $ipAddr = @ip_wan_field[1];
my $network = NetAddr::IP->new( @ip_wan_field[4], @ip_wan_field[5] );
my $ip = NetAddr::IP->new($coreipAddr);
if ( $ip->within($network) && $ip ne $ipAddr ) {
print "$ip IS IN THE SAME subnet as $network \n";
}
else {
print "$coreipAddr is outside the subnet for $network\n\n";
}
}
}
答案 0 :(得分:4)
您的SQL查询是单遍操作。如果要多次循环遍历第二个集合,则需要缓存值并在缓存上进行交互,或者重新运行查询。
我当然会建议您使用fetchall_arrayref
my $wan_arrayref = $wan_collection->fetchall_arrayref;
while ( my @ip_core_wan_field = $wan_core_collection->fetchrow_array() ) {
my $coreipAddr = @ip_core_wan_field[1];
for my $ip_wan_field_ref (@$wan_arrayref) {
my @ip_wan_field = @$ip_wan_field_ref;
当然还有其他方法可以提高此操作的效率,但这是您当前问题的症结所在。