Perl 乘法十进制

Perl 乘法十进制,perl,multiplication,Perl,Multiplication,当结果出来的时候,如果我把它乘以0.62,它会给出错误的结果。但如果我把它乘以整数1或2就可以了。我怎么做十进制乘法 Input ***** HEADER GAME BALL X1 ; GOOD CATCH 1 5.6770 4.550 3.455 2.333 ; END END Output ****** HEADER GAME BALL X1 ; GOOD CATCH 1 3.5197.4 2.821 2.1421 1.4464.

当结果出来的时候,如果我把它乘以0.62,它会给出错误的结果。但如果我把它乘以整数1或2就可以了。我怎么做十进制乘法

Input
*****

HEADER
  GAME
     BALL X1 ;
     GOOD CATCH 1 5.6770 4.550 3.455 2.333 ;
     END
END

Output
******
HEADER
  GAME
     BALL X1 ;
     GOOD CATCH 1 3.5197.4 2.821 2.1421 1.4464.6 ;
     END
END


use strict ;

sub multiply {
    my ( $str ) = @_;

    $str =~ s/(GOOD CATCH.*?;)/_multiply($1)/ge;
    return $str;
}

sub _multiply {
    my ( $str ) = @_;

    $str =~ s/(\d\d+)/_mul_number($1)/ge;
    return $str;
}

sub _mul_number {
    my ($num) = @_;

    return $num * 2;
}
正则表达式$str=~s/\d\d+/\u mul\u number$1/ge;查找\d\d+,它将匹配两个或更多数字的序列,但不匹配小数点。对于十进制数,它将它们视为两个独立的数字;例如,给定12.34,它将分别处理12和34,得到7.44和21.08,最终结果为7.44.21.08。这可能不是你想要的

为了处理输入中的十进制数,需要展开正则表达式以匹配它们。一个简单的可能性是[\d.]+,即:$str=~s/[\d.]+/\u mul\u number$1/ge


一个更复杂的正则表达式还可以确保最多有一个小数点可以拒绝12.34.56或允许正数和负数的+和/或-符号。

我现在用s/[d.]+/\u mul\u数得到了正确的结果,但我如何不跳过第一个数字呢?我不想让第一位数字相乘。它应该从第二位到第四位开始。对,这可能是在乘法函数中最容易做到的;改变s/好渔获量。*/_将$1/ge乘以s/GOOD CATCH\s+\d+.*/$1乘以$2/ge,这样第一个数字就不会被传递到乘法中。但是,如果它变得比这复杂得多,您可能希望将其拆分为几行,首先将该行拆分为几个变量,然后分别处理每个变量。