4 arrays perl hash file while-loop
在我的上一个问题中,我询问了在我的Perl脚本中存储文本文件数据的正确方法,解决方案是使用AoH.
无论如何,我的实现似乎是不完整的:
#!/usr/bin/perl
use strict;
use warnings;
# Open netstat output
my $netstat_dump = "tmp/netstat-output.txt";
open (my $fh, "<", $netstat_dump) or die "Could not open file '$netstat_dump': $!";
# Store data in an hash
my %hash;
while(<$fh>) {
chomp;
my ($Protocol, $RecvQ, $SendQ, $LocalAddress, $ForeignAddress, $State, $PID) = split(/\s+/);
# Exclude $RecvQ and $SendQ
$hash{$PID} = [$Protocol, $LocalAddress, $ForeignAddress, $State $PID];
}
close $fh;
print Dumper \%hash;
Run Code Online (Sandbox Code Playgroud)
第一个问题是,$PID即使$PID在上面的行中声明,我也会得到未初始化的值错误.
脚本的第二个问题是它从输入文件中加载最后一个字母并将它们放在自己的行中:
$VAR1 = {
...
'6907/thin' => [
'tcp',
'127.0.0.1:3001',
'0.0.0.0:*',
'LISTEN',
'6907/thin'
],
'' => [
'udp6',
':::49698',
':::*',
'31664/dhclient',
''
],
'r' => [
'udp6',
':::45016',
':::*',
'651/avahi-daemon:',
'r'
]
};
Run Code Online (Sandbox Code Playgroud)
'' =>并且'r' =>从它看起来像这样的输入文件来:
tcp 0 0 0.0.0.0:3790 0.0.0.0:* LISTEN 7550/nginx.conf
tcp 0 0 127.0.1.1:53 0.0.0.0:* LISTEN 1271/dnsmasq
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 24202/cupsd
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 11222/postgres
tcp 0 0 127.0.0.1:3001 0.0.0.0:* LISTEN 6907/thin server (1
tcp 0 0 127.0.0.1:50505 0.0.0.0:* LISTEN 6874/prosvc
tcp 0 0 127.0.0.1:7337 0.0.0.0:* LISTEN 6823/postgres.bin
tcp6 0 0 ::1:631 :::* LISTEN 24202/cupsd
udp 0 0 0.0.0.0:46096 0.0.0.0:* 651/avahi-daemon: r
udp 0 0 0.0.0.0:5353 0.0.0.0:* 651/avahi-daemon: r
udp 0 0 127.0.1.1:53 0.0.0.0:* 1271/dnsmasq
udp 0 0 0.0.0.0:68 0.0.0.0:* 31664/dhclient
udp 0 0 0.0.0.0:631 0.0.0.0:* 912/cups-browsed
udp 0 0 0.0.0.0:37620 0.0.0.0:* 31664/dhclient
udp6 0 0 :::5353 :::* 651/avahi-daemon: r
udp6 0 0 :::45016 :::* 651/avahi-daemon: r
udp6 0 0 :::49698 :::* 31664/dhclient
Run Code Online (Sandbox Code Playgroud)
它还让我觉得我的哈希函数没有解析整个文件并在某处中断.
拆分行时,例如:
udp 0 0 0.0.0.0:37620 0.0.0.0:* 31664/dhclient
Run Code Online (Sandbox Code Playgroud)
在空格上你得到5个元素,而不是6.这是因为状态列中没有字符串并且PID被赋值给$State.
同样,
udp 0 0 0.0.0.0:5353 0.0.0.0:* 651/avahi-daemon: r
Run Code Online (Sandbox Code Playgroud)
将pid存储为第5个元素(state),将'r'存储为第6个(pid),因为PID中的冒号和r之间有空格.
您可能希望使用unpack来拆分固定宽度字段.请注意,如果输入具有基于内容的不同列宽,则需要确定要使用解压缩的列宽.
请参阅教程以获取操作方法.
| 归档时间: |
|
| 查看次数: |
200 次 |
| 最近记录: |