在Perl中以二进制格式打印和保存数据

时间:2014-10-30 21:59:29

标签: perl

我的脚本会生成一些非常大的文件,我试图以二进制格式打印/保存输出,以尽可能减小文件大小!

每次该脚本生成五个值,例如:

$a1 = 1.64729
$a2 = 4.33329
$a3 = 3.55724
$a4 = 1.45759
$a5 = 7.474700

它在输出中打印如下:

A:1.64729,4.33329,3.55724,1.45759,7.474700

我不确定这是否是最佳方式,但我想在打印到输出时打包每一行!我在Perl中使用了pack / unpack内置函数!

我看过perldoc,但我不明白哪种格式说明符合适(???)!

#!/usr/bin/perl

...

@A = ($a1,$a2,$a3,$a4,$a5);

print pack ("???", ("A:", join(",", map { sprintf "%.1f", $_ } @A)), "\n";

1 个答案:

答案 0 :(得分:1)

如果压缩文件(而不是尝试写二进制字节),您将获得一个小文件。这是因为你的整个文件大部分都是十位数字,加上一个小数点和一个逗号。

您可以在通过IO::Zlib撰写文件时压缩文件。这将使用Zlib库或gzip命令。

但是,如果您想使用pack,请继续。获取Camel Book,它提供了比标准Perldoc更清晰的文档。

这并不困难:

my $output = "A:1.64729,4.33329,3.55724,1.45759,7.474700";
$output =~ s/^A://;                  #Remove the 'A:'
my @numbers = split /,/, $output     # Make into an array
my $packed =  pack "d5", @numbers;   # Pack five inputs as floating point numbers
say join ",", "d5", $packed;         # Unpacks those five decimal encoded numbers

您可能不得不使用syswritesysread,因为它们不会读写字符串。这是无缓冲的读写,你必须指定你正在读或写的字节数。

还有一件事:如果您知道小数点在数字中的位置(也就是说,它始终是介于1和最大10之间的数字),您可以将数字转换为整数,这样您就可以打包将数字转换为更小的字节数:

my $output = "A:1.64729,4.33329,3.55724,1.45759,7.474700";
$output =~ s/^A://;                  #Remove the 'A:'
$output =~ s/,//g;                   #Remove all the decimal points
my @numbers = split /,/, $output     # Make into an array
my $packed =  pack "L5", @numbers;   # Pack five inputs as unsigned long numbers