4

次のような数値を変換する方法があるかどうか疑問に思っていました

100u     10km     300nm      and so on

そのため、次のように解釈されます。

100*10^-6      10*10^3      300*10^-6

これらの数値 (100u、10km など) を比較する必要があります。たとえば、100u と 10u を比較したい場合は問題ありません。私は次のことを行いますが、これは正しくありませんが、仕事はします:

$distance =~ s/(.*)u/$1/;
if ($distance >= $desired_distance) {
       printf $distance;
}

(.*)u数字です。たとえば、100u です。そのため、 を削除してuから、数値と比較します。

しかし、私が番号を持っている場合はどうなりますか

1.45m 

そして私はそれを比較したい

1400u

上記のことは役に立ちません。

4

3 に答える 3

12

Number::FormatEngは、標準のプレフィックスを数値に変換するのに役立ちます。

use warnings;
use strict;

use Number::FormatEng qw(:all);
for (qw(100u 1.45m 1400u)) {
    print "$_ ", unformat_pref($_), "\n";
}

__END__

100u 0.0001
1.45m 0.00145
1400u 0.0014
于 2013-01-17T13:58:07.347 に答える
7

そのための CPAN モジュールがない場合は、いつでも自分で作成できます。

my %units = (
    m  => 1,
    km => 1000,
    mm => 0.001,
);

for my $num (qw(10 10km 10mm)) {
    $num =~ /(\d+)(\w+)?/;
    my $value = $1;
    my $unit  = $2 || 'm';
    print "$num = ", $value*$units{$unit}, " m\n";
}

どの出力:

10 = 10 m
10km = 10000 m
10mm = 0.01 m

さらに、テストとエラー処理。より慣用的な表現については、TLPの回答を参照してください。

于 2013-01-17T13:57:31.197 に答える
6

入力を正規化するサブルーチンを作成するだけです。

sub normalize {
    my %unit = (
        u  => 10^-6,
        km => 10^3,
        # etc
    );
    my $num = shift;
    my ($base, $unit) = $num =~ /(\d+)(\S+)/;
    $base *= $unit{$unit} // 1;   # default to 1 if no unit is found
    return $base;
}
于 2013-01-17T14:00:00.997 に答える