我想知道是否有办法转换像
这样的数字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。所以我只删除“你”,然后将其与数字进行比较。
但如果我有号码
那该怎么办?1.45m
我希望将它与
进行比较1400u
以上事情无济于事。
答案 0 :(得分: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
答案 1 :(得分: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
Plus测试和错误处理。请参阅TLP的答案,了解更多惯用语。
答案 2 :(得分: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;
}