有一個檔案包含超過 2000 萬條記錄。我需要使用 perl 來匯總數字并在最后一行列印 TOTAL。我應該匯總的數字是非常大的數字,它們可能是正數或負數。我正在使用 perl 的 bignum 模塊來聚合數字。但是,它沒有顯示正確的結果。請指教。
sample.txt(實際上,這個檔案包含超過 2000 萬條記錄):
12345678910111213.00
14151617181920212.12345
23242526272829301.54321
32333435363738394.23456
-41424344454647489.65432
預期輸出(我的 perl 一行在最后一行顯示不正確的 TOTAL):
12345678910111213.00
14151617181920212.12345
23242526272829301.54321
32333435363738394.23456
-41424344454647489.65432
TOTAL=<<total_should_be_printed>>
我正在使用的 perl one 班輪:
perl -Mbignum -ne 'BEGIN{my $sum=0;} s/\r?\n$//; $sum=$sum $_; print "$_\n"; END{print "TOTAL=$sum"."\n";}' sample.txt
perl one-liner 將 TOTAL 顯示為 40648913273951600.00,這是不正確的。
編輯:以下單行顯示 40648913273951631.2469 作為答案。現在真的越來越奇怪了......
perl -Mbignum -e 'my $num1=Math::BigFloat->new("12345678910111213.00"); my $num2=Math::BigFloat->new("14151617181920212.12345"); my $num3=Math::BigFloat->new("23242526272829301.54321"); my $num4=Math::BigFloat->new("32333435363738394.23456"); my $num5=Math::BigFloat->new("-41424344454647489.65432"); my $sum=$num1 $num2 $num3 $num4 $num5; print $sum."\n";'
uj5u.com熱心網友回復:
請根據Math::BigFloat
模塊驗證計算。
use strict;
use warnings;
use feature 'say';
use Math::BigFloat;
my $sum = Math::BigFloat->new(0);
$sum->precision(-5);
while( <DATA> ) {
my $x = Math::BigFloat->new($_);
$sum->badd($x);
say $x;
}
say "\nSUM: $sum";
exit 0;
__DATA__
12345678910111213.00
14151617181920212.12345
23242526272829301.54321
32333435363738394.23456
-41424344454647489.65432
輸出
12345678910111213
14151617181920212.12345
23242526272829301.54321
32333435363738394.23456
-41424344454647489.65432
SUM: 40648913273951631.24690
uj5u.com熱心網友回復:
bignum
pragma的主要作業是將文字數字轉換為Math::BigInt
物件。一旦分配給一個變數,該變數也將是一個物件,并且使用它執行的任何算術運算都將使用Math::BigInt
運算子多載來完成。
由于您正在從檔案中讀取值,因此它們不會自動轉換為Math::BigInt
值。因此,在這種情況下,您需要其他東西作為物件$sum
。通過像您所做的那樣初始化文字 0 值,$sum
成為一個物件。不幸的是,您在塊my $sum
的范圍內宣告BEGIN
。在這個范圍之外,$sum
指的是一個不同的包變數,它沒有被初始化為一個物件。
因此,您需要在 之外宣告變數BEGIN
,或向其添加文字零以將其強制轉換為物件:
perl -Mbignum -lne' $sum = 0 $_; END {print $sum}'
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/513195.html
標籤:perl
下一篇:Perl檔案的VIM9字邊界更改