Perl从文件读入哈希
我想将文件的内容读入哈希结构。文件的头应该是散列结构中的键,值应该是每列下面列出的内容 我将要从中读取的文件看起来像这样Perl从文件读入哈希,perl,hash,Perl,Hash,我想将文件的内容读入哈希结构。文件的头应该是散列结构中的键,值应该是每列下面列出的内容 我将要从中读取的文件看起来像这样 Recv-Q Send-Q Local Address:Port Peer Address:Port 0 128 *:111 *:* users:(("rpcbind",1268,8)) 0
Recv-Q Send-Q Local Address:Port Peer Address:Port
0 128 *:111 *:* users:(("rpcbind",1268,8))
0 128 *:53845 *:* users:(("rpc.statd",1404,9))
0 128 *:22 *:* users:(("sshd",1577,3))
0 128 127.0.0.1:631 *:* users:(("cupsd",1452,7))
0 100 127.0.0.1:25 *:* users:(("master",1686,12))
我想把端口作为一个键,包含以下键:111,53845,22,631,25。如何将此文件读入我概述的结构中的哈希?如果您的数据是以制表符分隔的,如您在上面的评论中所述,您可以使用
split
函数将字符串(例如,文件中的一行)拆分为一个值数组。在大多数系统上,如果正确安装了perl,您可以使用命令perldoc-f split
查看该函数的文档
# Read the first line of the file:
my $header = <$fh>;
chomp $header;
my @fields = split /\t/, $header;
#
# Then read the rest of the lines:
my %data;
while (my $line = <$fh>)
{
my @values = split /\t/, $line;
@data{@fields} = @values;
... # do something with %data here
}
#读取文件的第一行:
我的$header=;
chomp$header;
my@fields=split/\t/,$header;
#
#然后读剩下的几行:
我的%数据;
while(我的$line=)
{
my@values=split/\t/,$line;
@数据{@fields}=@值;
…#在此处使用%数据执行某些操作
}
如果您的数据是以其他方式分隔的,则必须修改如何将每行拆分为字段。我将为您提供一个关于如何解析数据的基本入门课程
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my @header = split ( " ", <DATA> );
my %service_on;
while ( <DATA> ) {
my ( $recvq, $sendq, $locaddr_port, $peeraddr_port, $thing ) = split;
my ( $locaddr, $port ) = split ( ":", $locaddr_port );
$service_on{$port} = $thing;
}
print Dumper \%service_on;
__DATA__
Recv-Q Send-Q Local Address:Port Peer Address:Port
0 128 *:111 *:* users:(("rpcbind",1268,8))
0 128 *:53845 *:* users:(("rpc.statd",1404,9))
0 128 *:22 *:* users:(("sshd",1577,3))
0 128 127.0.0.1:631 *:* users:(("cupsd",1452,7))
0 100 127.0.0.1:25 *:* users:(("master",1686,12))
您需要确定如何将行拆分为字段。只是空间?科隆?固定位置?然后,您需要读取第一条记录,并将其拆分为字符串数组。最后,读取所有其他记录,将每个记录拆分为一个值数组,并根据从文件第一行读取的数组中的键将其分配给哈希值。我真的不知道如何成功完成此任务。我只编程了简单的任务,逐行读取文件。我不知道如何让程序知道我想使用第一行标题作为键。我知道我应该使用“tab”作为分隔符。请查看文档中的“split”。您的散列将包含什么?基本上,散列应该包含此文件中的所有信息。它应该在“tab”上拆分,在某些情况下还应该是“:”以及使用头:Recv-Q、Send-Q、本地地址、端口、对等地址和端口作为键,指向值。这些值应该是列中每个键下面列出的数据。
while ( <DATA> ) {
my %fields;
@fields{@header} = split;
my ( $locaddr, $port ) = split ( ":", $fields{$port_field} );
print Dumper \%fields;
}