我有一个用 Perl 编写的解析器,它解析固定长度记录的文件。部分记录由几个字符串(也是固定长度)组成,仅由数字组成。字符串中的每个字符都被编码为数字,而不是 ASCII 字符。即,如果我有字符串 12345,它被编码为 01 02 03 04 05(而不是 31 32 33 34 35)。
我用 unpack 解析记录,这个特定部分被解包为@array = unpack "C44", $s
. 然后我用简单的连接恢复所需的字符串,比如$m = join("", @array)
.
我想知道这是否是解码的最佳方式。文件很大,有数百万条记录,显然我试图看看是否可以优化。Profiler 显示大部分时间都花在了解析记录上(即,读、写和其他东西都不是问题),而解析大部分时间都花在了这些连接上。我记得从其他来源那里加入是非常有效的操作。有什么想法可以加快代码速度还是已经达到最佳状态?也许有可能以某种巧妙的方式避免这个中间数组,例如,改用打包/解包组合?
编辑:代码示例
我尝试优化的代码如下所示:
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]));
}