0

私はperlを使用して、タブ区切りの単一行として配置された要素の配列を生成しています。ただし、私の配列の一部だけがこのようになっています。他の部分は別の行として印刷されます。

以下は、コードの関連部分です。

これは、3 つの条件付きforループが埋め込まれた foreach ループです。このコマンドは、4 つの異なる/条件pushで 4 回使用されます。私が問題を抱えている特定の配列は. いくつかの変数が最初の近くで定義されていますが、無視できます。それらは問題ではないと思います。ifelse@imputed_positions

$distance変数がの場合、得られる出力は 1 行として正しく出力されますが> 1、これらの値は push コマンドの 3 つの個別のインスタンス (最初の 3 つ) によって処理されます。$distanceその値> 1と $distance の浮動小数点値は、1 行として出力されます。$distance< 1またはの場合= 1、それらは別々の行として出力されます。これらの行は、4 つのプッシュ コマンドの最後によって @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、出力は 1 行ではなく、次のようになります。

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 に答える