正如标题所述,我想阅读由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 ,本地地址:端口和对等地址:端口为键到哈希。此后的值将包含驻留在每个标题列下的数据。目标是能够使用标头过滤掉某些列作为指向值的指针。
我希望实现的代码结构将是列出所有标头的哈希,并且在每个标头中会有一个数组包含所有列数据。
我没有任何关于如何解决此问题的代码示例,但我非常感谢有关此问题的任何帮助。
答案 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, "*", "*"],
]