我有一個包含數字的列表,看起來像這樣的文件:如何將3 10^-20這樣的字符串轉換爲Perl中的數字?
10^-92
2 10^-14
10^-105
3 10^-20
爲了解釋遠一點10^-92
基本上是1E-92
和2 10^-14
是2E^-14
。 有沒有一種緊湊的方式將上面的文件中的數字轉換爲Perl數字?最後,我想對這些數字進行數字排序。
我有一個包含數字的列表,看起來像這樣的文件:如何將3 10^-20這樣的字符串轉換爲Perl中的數字?
10^-92
2 10^-14
10^-105
3 10^-20
爲了解釋遠一點10^-92
基本上是1E-92
和2 10^-14
是2E^-14
。 有沒有一種緊湊的方式將上面的文件中的數字轉換爲Perl數字?最後,我想對這些數字進行數字排序。
如果所有的號碼需要相同的轉換成爲數字到Perl的,爲什麼不使用正則表達式替換:
use 5.010;
my @nums = ('10^-92', '2 10^-14', '10^-105', '3 10^-20');
s{ (\d*) \s* 10\^ }{ ($1 || 1) . 'e' }xe for @nums;
say "@nums"; # 1e-92 2e-14 1e-105 3e-20
$ perl -ne 's/ /*/;s/\^/E/;print "\n".eval $_' file
2e-13
1e-91
2e-13
1e-104
3e-19
如果你想有一個Perl的數字,只是直奔數不EVAL。存儲您提取數量的部分,並在緩存鍵排序使用它們:
use 5.010;
while(<DATA>)
{
chomp;
m/
(?:
(?<coefficient> \d+ (?:\.\d+)?)
\s+
)?
(?<base> (\d+))
\^
(?<exponent> -?\d+)
/x;
push @numbers,
[ ($+{coefficient} // 1), $+{exponent}, $_ ];
}
my @sorted = sort {
$a->[1] <=> $b->[1]
||
$a->[0] <=> $b->[0]
} @numbers;
foreach my $number (@sorted)
{
print "$number->[-1]\n";
}
__DATA__
10^-92
2 10^-14
10^-105
3 10^-20
可以熬下來到使用Schwartzian變換:
use 5.010;
print
map {
$_->[-1]
}
sort {
$a->[1] <=> $b->[1]
||
$a->[0] <=> $b->[0]
}
map {
m/
(?:(?<c> \d+ (?:\.\d+)?) \s+)? # coefficient
(?<b> (\d+)) # base
\^
(?<e> -?\d+) # exponent
/x;
[ ($+{c} // 1), $+{e}, $_ ];
} <DATA>;
__DATA__
10^-92
2 10^-14
10^-105
3 10^-20
這些都是關閉由一個在指數 – 2010-04-15 01:49:32