满足条件后循环不起作用

时间:2014-10-21 08:29:35

标签: perl

我有两个文件myresult和annotation。这些文件的详细信息如下。 myresult:

288..639 1.13075739182609-6.20035408429888i
300..651 1.90372125344918-6.09008858828515i
312..663 1.6908117147722-5.67058877579329i
324..675 0.644484787809351-5.54571698740166i
336..687 1.21850904281332-5.47700589647424i 

注释:

272..1042
1649..2629

For loop在满足If条件后仅运行一次。即使满足条件,它也不会再循环进入循环。例如,在文件myresult第二行满足条件即数字300..651位于文件注释的第一行范围内,因此它打印所有值从300到651.但是当它需要进入下一轮时(第3行) )即312..663它没有进入这个循环,因为这个范围也位于文件注释的第一行。 因此输出应该是300到663之间的数字,但它仅从300到651打印。 代码:

#!/usr/bin/perl
use Math::Complex;

open( $inp0, "<myresult" )   or die "not found";
open( $inp2, "<annotation" ) or die "not found";

my @arr2 = <$inp0>;
my @arr4 = <$inp2>;
my @result;

foreach my $line1 (@arr2) {
    my ( $col1, $col2 ) = split( /\s/, $line1 );
    if ( $col2 > 1.60 ) {
        my ( $from1, $to1 ) = split( /\.\./, $col1 );

        foreach my $line2 (@arr4) {
            my ( $from2, $to2 ) = split( /\.\./, $line2 );

            for ( my $i = $from1; $i <= $to1; $i++ ) {
                for ( my $j = $from2; $j <= $to2; $j++ ) {

                    $res = grep( /$i/, @result );
                    if ( $i == $j && $res == 0 ) {
                        print "$i \n";
                        push( @result, $i );
                    }
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

文件“myresult”的第二列包含复数,例如“1.13075739182609-6.20035408429888i”。

无法比较两个复数。 (复数是具有实轴和虚轴的复平面矢量。两个矢量无法像整数那样进行比较。)

对于“myresult”文件中的所有数据,

'($ col2&gt; 1.60)'将为false。这就是为什么不执行循环。

答案 1 :(得分:0)

正如富姆所说,无法比较两个复数。

如果您需要有关Perl中复数的帮助,请查看Math::Complex模块。