0

我正在使用 perl 生成一个元素数组,这些元素排列为单个制表符分隔的行。但是,我的数组中只有一部分是这样的。其他部分打印为单独的行。

以下是代码的相关部分。

它是一个 foreach 循环,其中for嵌入了三个条件循环。该命令在四种不同的/条件下push使用了四次。我遇到问题的特定数组称为. 在开头附近定义了几个变量,可以忽略。我不认为这些是问题。ifelse@imputed_positions

$distance当变量为时,我得到的输出正确打印为单行> 1,即使这些值由 push 命令的 3 个单独实例(前三个)处理。$distance 的值和浮点值$distance> 1打印为单行。当$distance< 1= 1时,它们被打印为单独的行。这些行对应于由四个推送命令中的最后一个推送到 @imputed_positions 的元素。

我无法识别“类似问题”中的类似问题,这可能是因为我对问题所在没有足够精确的线索。

谢谢!!!

foreach my $distance ( @distances ) {

    if ( $distance > 1 &&
       ( int ( $distance ) != $distance ) ) {       ###just asking whether $variable is an integer and whether it is > than 1.

        my $rounded_up = rounding_up( $distance );
        my $rounded_down = rounding_down( $distance );

        my $up_distance = $distance/$rounded_up;
        my $down_distance = $distance/$rounded_down;

        my $abs_up = abs ( 1 - $up_distance );
        my $abs_down = abs ( 1 - $down_distance );  

        if ( $abs_up < $abs_down ) {
            for ( my $i = 0; $i < $rounded_up; $i++ ) {
                push ( @imputed_positions, "IMP!$up_distance!A\tIMP!$up_distance!D\tIMP!$up_distance!I\t" );
            }
        }
        else {
            for ( my $i = 0; $i < $rounded_down; $i++ ){
                push ( @imputed_positions, "IMP!$down_distance!A\tIMP!$down_distance!D\tIMP!$down_distance!I\t" );
            }
        }
    }
    else {
        if ( $distance > 1 ){

            for ( my $i = 1; $i <= $distance; $i++ ) {
                push ( @imputed_positions, "IMP!1!A\tIMP!1!D\tIMP!1!I\t" );
            }
        }
        else {
            push ( @imputed_positions, "IMP!$distance!A\tIMP!$distance!D\tIMP!$distance!I\t" );
        }
    }
}

#print @imputed_positions;

#rounding down subroutine
sub rounding_down {
    my ( $round_me ) = @_;
    my $rounded_down = int( $round_me );
    return $rounded_down;
}

#rounding up subroutine
sub rounding_up {
    my ( $round_me ) = @_;
    my $rounded_up = int( $round_me ) + 1;
    return $rounded_up;
}

如果我解释输入可能会有所帮助。@distances 只是一个 txt 文件,其中每一行都是一个数字。数字都是正数,可以是 0、整数或浮点数。例如,@distance = ( 1, 3, 5.9999, 4.9, 3.1, 3.000001, 0, 0, 0.3 )

@distance包含上述元素时,输出不会打印为单行,而是如下所示:

IMP!1
!A      IMP!1
!D      IMP!1
!I      IMP!1!A IMP!1!D IMP!1!I IMP!1!A IMP!1!D IMP!1!I IMP!1!A IMP!1!D            IMP!1!IIMP!0.999999998333333!A   IMP!0.999999998333333!D IMP!0.999999998333333!I IMP!0.999999998333333!A IMP!0.999999998333333!D IMP!0.999999998333333!I IMP!0.999999998333333!A IMP!0.999999998333333!D IMP!0.999999998333333!I IMP!0.999999998333333!AIMP!0.999999998333333!D  IMP!0.999999998333333!I IMP!0.999999998333333!A IMP!0.999999998333333!D IMP!0.999999998333333!I IMP!0.999999998333333!A IMP!0.999999998333333!D IMP!0.999999998333333!I IMP!0.98!A  IMP!0.98!D  IMP!0.98!I  IMP!0.98!A  IMP!0.98!D  IMP!0.98!I  IMP!0.98!A  IMP!0.98!D  IMP!0.98!I  IMP!0.98!A  IMP!0.98!D  IMP!0.98!I  IMP!0.98!A  IMP!0.98!D  IMP!0.98!I  IMP!1.03333333333333!A  IMP!1.03333333333333!D  IMP!1.03333333333333!I  IMP!1.03333333333333!A  IMP!1.03333333333333!D  IMP!1.03333333333333!I  IMP!1.03333333333333!A  IMP!1.03333333333333!D  IMP!1.03333333333333!I  IMP!1.00000003333333!A  IMP!1.00000003333333!D  IMP!1.00000003333333!I  IMP!1.00000003333333!A  IMP!1.00000003333333!D      IMP!1.00000003333333!I  IMP!1.00000003333333!A  IMP!1.00000003333333!D  IMP!1.00000003333333!I   IMP!0
!A      IMP!0
!D      IMP!0
!I      IMP!0
!A      IMP!0
!D      IMP!0
!I      IMP!0.3
!A      IMP!0.3
!D      IMP!0.3
!I
4

1 回答 1

2

我的猜测是错误发生在你的代码中,你带来了距离。您似乎没有从输入行中删除尾随换行符。

当您使用 执行某些计算时$distance,Perl 将其视为整数。但是,除非您已显式转换$distance为数字类型(例如,$distance += 0;),否则它会尽可能被视为字符串,因此当您将其插入字符串时,您的字符串中将包含换行符。

如果您有类似以下的代码:

while(my $line = <INPUT>) {
    # Do some stuff with $line
}

将其更改为:

while(my $line = <INPUT>) {
    chomp $line;
    # Now do your stuff with $line
}

有关详细信息,请参阅perldoc

于 2012-11-14T18:06:38.207 回答