Имам няколко номера във файл в различниформати: 8.3, 0.001, 9е-18. Аз търся лесен начин да ги прочета и съхранявам без загуба на точност. Това би било лесно в AWK, но как се прави в Perl? Аз съм отворен само за използване на Perl. Благодаря!
Също така се чудех дали има лесен начин да ги отпечатате в подходящ формат. Например, 8.3 трябва да се отпечата като "8.3", а не с "8.3e0"
Отговори:
4 за отговор № 1Ако те "текстови низове, а след това ги чете."Perl като низове и записването им като низове не трябва да води до загуба на прецизност. Ако трябва да правите аритметика върху тях, предлагам да инсталирате CPAN модула Math :: BigFloat, за да сте сигурни, че не губите никаква точност закръгляване.
Що се отнася до втория ви въпрос, Perl не прави преформатиране, освен ако не го помолите да:
$ perl -le "print 8.3"
8.3
Изпускам ли нещо?
1 за отговор № 2
от http://perldoc.perl.org/perlnumber.html:
Perl може вътрешно да представлява числа в 3различни начини: като роден числа, като числа с плаваща запетая и като десетични струни. Десетичните низове могат да имат експоненциална част от нота, както е в "12.34e-56". Native тук означава "формат, поддържан от компилатора C. който е бил използван за изграждане на perl ".
Това означава, че отпечатването на числото зависи от това как номерът се съхранява вътрешно в perl, което означава, че на свой ред трябва да знаете как номерът е представен на входа.
Като цяло, Perl просто ще направи правилното нещо, но трябва да знаете какъв компилатор е бил използван, как представя числата вътре и как да отпечатате тези числа. Например:
$ perldoc -f int
int EXPR
int Returns the integer portion of EXPR. If EXPR is omitted, uses $_. You should
not use this function for rounding: one because it truncates towards 0, and two
because machine representations of floating-point numbers can sometimes produce
counterintuitive results. For example, "int(-6.725/0.025)" produces -268 rather than
the correct -269; that"s because it"s really more like -268.99999999999994315658
instead. Usually, the "sprintf", "printf", or the "POSIX::floor" and
"POSIX::ceil" functions will serve you better than will int().
Мисля, че ако искате да четете число изрично като низ, най-добре е да използвате unpack () с формат "A *".