How to convert a string of type 3 10 ^ -20 to a number in Perl?

I have a file containing a list of numbers that looks like this:

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

To explain a little further 10^-92 , essentially 1E-92 and 2 10^-14 are 2E^-14 . Is there a compact way to convert the number in the file above to a Perl number? In the end, I want to sort these numbers numerically.

+4
source share
3 answers

If all of your numbers require the same conversion to become numeric for Perl, why not use regular expression substitution:

 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 
+5
source

If you want a Perl number, just go straight to the number without eval. Save the parts you are extracting and use them as a cache key:

 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 

You can weld this before the Schwartz transform:

 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 
+1
source
 $ perl -ne 's/ /*/;s/\^/E/;print "\n".eval $_' file 2e-13 1e-91 2e-13 1e-104 3e-19 
0
source

Source: https://habr.com/ru/post/1306990/


All Articles