2010-04-15 5 views

Répondre

5

Si tous vos numéros exigent la même transformée pour devenir numérique à Perl, pourquoi ne pas utiliser une substitution regex:

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

ce sont tous hors d'un dans la exposant –

1

Si vous voulez un numéro Perl, il suffit d'aller directement au numéro sans eval. Conserver les parties du numéro que vous extraire et de les utiliser dans une sorte de clé mises en cache:

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 

Vous pouvez faire bouillir que jusqu'à une Schwartzienne Transformer:

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 
Questions connexes