Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl从文件读入哈希_Perl_Hash - Fatal编程技术网

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))

我想把端口作为一个键,包含以下键:111538452263125。如何将此文件读入我概述的结构中的哈希?

如果您的数据是以制表符分隔的,如您在上面的评论中所述,您可以使用
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;
}