2010-04-15 34 views
4

我有一個包含數字的列表,看起來像這樣的文件:如何將3 10^-20這樣的字符串轉換爲Perl中的數字?

10^-92 
2 10^-14 
10^-105 
3 10^-20 

爲了解釋遠一點10^-92基本上是1E-922 10^-142E^-14。 有沒有一種緊湊的方式將上面的文件中的數字轉換爲Perl數字?最後,我想對這些數字進行數字排序。

回答

5

如果所有的號碼需要相同的轉換成爲數字到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 
0
$ perl -ne 's/ /*/;s/\^/E/;print "\n".eval $_' file 

2e-13 
1e-91 
2e-13 
1e-104 
3e-19 
+0

這些都是關閉由一個在指數 – 2010-04-15 01:49:32

1

如果你想有一個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 
相關問題