我的脚本会生成一些非常大的文件,我试图以二进制格式打印/保存输出,以尽可能减小文件大小!
每次该脚本生成五个值,例如:
$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";
答案 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
您可能不得不使用syswrite
和sysread
,因为它们不会读写字符串。这是无缓冲的读写,你必须指定你正在读或写的字节数。
还有一件事:如果您知道小数点在数字中的位置(也就是说,它始终是介于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