Perl - 以结构化方式读取文件的内容

时间:2015-05-11 08:49:43

标签: arrays perl hash

正如标题所述,我想阅读由Perl脚本动态生成的现有文件的内容。此文件或多或少将遵循以下示例中所示的相同结构。唯一真正的区别是随后的数据量。

Recv-Q Send-Q             Local Address:Port               Peer Address:Port 
0      128                            *:111                           *:*     
0      128                            *:22                            *:*     
0      128                    127.0.0.1:631                           *:*     
0      128                            *:53944                         *:*     
0      100                    127.0.0.1:25                            *:*   

读取此文件的目标是使用数据并进一步过滤其内容。一个例子是只列出具有 Port:22 的数据并将其呈现给最终用户,但这不是我的问题。

我想要实现的是读取每个标头,例如 Recv-Q Send-Q 本地地址:端口对等地址:端口到哈希。此后的值将包含驻留在每个标题列下的数据。目标是能够使用标头过滤掉某些列作为指向值的指针。

我希望实现的代码结构将是列出所有标头的哈希,并且在每个标头中会有一个数组包含所有列数据。

我没有任何关于如何解决此问题的代码示例,但我非常感谢有关此问题的任何帮助。

1 个答案:

答案 0 :(得分:2)

只要在任何字段中都没有任何空格字符,您就可以使用split

该程序使用正则表达式执行非常类似的操作,但将行分为六个字段而不是四个 - 保持端口号与地址分开。它应该至少让你开始

use strict;
use warnings;
use 5.010;

<DATA>; # Lose header line

my @data;
while ( <DATA> ) {
  push @data, [ /[^\s:]+/g ];
}

use Data::Dump;
dd \@data;

__DATA__
Recv-Q Send-Q             Local Address:Port               Peer Address:Port 
0      128                            *:111                           *:*     
0      128                            *:22                            *:*     
0      128                    127.0.0.1:631                           *:*     
0      128                            *:53944                         *:*     
0      100                    127.0.0.1:25                            *:*   

<强>输出

[
  [0, 128, "*", 111, "*", "*"],
  [0, 128, "*", 22, "*", "*"],
  [0, 128, "127.0.0.1", 631, "*", "*"],
  [0, 128, "*", 53944, "*", "*"],
  [0, 100, "127.0.0.1", 25, "*", "*"],
]