我有一个用Perl编写的解析器,它解析固定长度记录的文件.记录的一部分由几个字符串(也是固定长度)组成,仅由数字组成.字符串中的每个字符都编码为数字,而不是ASCII字符.即,如果我有字
我用unpack解析记录,这个特殊部分解压缩为@array = unpack“C44”,$s.然后我通过简单连接恢复所需的字符串,例如$m = join(“”,@ array).
我想知道这是否是解码的最佳方式.文件非常庞大,有数百万条记录,显然我试图查看是否可以进行优化. Profiler显示大部分时间用于解析记录(即,读取,写入和其他内容不是问题),并且在解析大部分时间已经由这些连接进行.我记得其他来源说加入是非常有效的操作.任何想法,如果可以加快代码速度或已经是最佳的?也许有可能以某种巧妙的方式避免使用这个中间阵列,例如,使用pack / unpack组合代替?
编辑:代码示例
我尝试优化的代码如下所示:
while (read(READ, $buf, $rec_l) == $rec_l) { my @s = unpack "A24 C44 H8", $buf; my $msisdn = substr $s[0], 0, 11; my $address = join("", @s[4..14]); my $imsi = join("", @s[25..39]); my $ts = localtime(hex($s[45])); }未经测试(当我不那么忙的时候我会回来编辑)但是如果我已经正确地完成了所有的数学运算并且速度更快,这应该可行:
my ($msisdn, $address, $imsi, $ts) = unpack "A11 x13 x3 a10 x10 a15 x5 N", $buf; $address |= "0" x 10; $imsi |= "0" x 15 $ts = localtime($ts);