Perl:使用while将文件加载到哈希中

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)

它还让我觉得我的哈希函数没有解析整个文件并在某处中断.

Oes*_*sor 5

拆分行时,例如:

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来拆分固定宽度字段.请注意,如果输入具有基于内容的不同列宽,则需要确定要使用解压缩的列宽.

请参阅教程以获取操作方法.