私はperlを使用して、タブ区切りの単一行として配置された要素の配列を生成しています。ただし、私の配列の一部だけがこのようになっています。他の部分は別の行として印刷されます。
以下は、コードの関連部分です。
これは、3 つの条件付きfor
ループが埋め込まれた foreach ループです。このコマンドは、4 つの異なる/条件push
で 4 回使用されます。私が問題を抱えている特定の配列は. いくつかの変数が最初の近くで定義されていますが、無視できます。それらは問題ではないと思います。if
else
@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