将文件行分割成散列

问题描述 投票:0回答:2

我正在编写一个 Perl 脚本,需要执行一些验证。我有一个可用文件,其中包含以下信息

patchname subpatch1,subpatch2,subpatch3...

要读取文件内容并将子补丁放入数组中。这些子补丁可能包含更多需要使用稍后出现的 DFS 或 BFS 进行遍历的子补丁。 但是,当从文件中读取这些子补丁时,需要将这些子补丁映射到哈希,即:

$list->{subpatch1} = \subpatch1
$list->{subpatch2} = \subpatch2
$list->{subpatch3} = \subpatch3 ....

使用

split
没有帮助。

($a1,$2)=split;

给了我

$2=subpath1,subpatch2,...
,需要进一步拆分。这里真的很令人困惑,特别是因为我是 Perl 新手。

是否有更好的方法来执行上述操作,或者是否有任何模块可以实现此目的?

perl
2个回答
4
投票

您可以分割多个分隔符:

my ($name, @subs) = split /[\s,]+/;

perldoc -f 分割


2
投票

我认为您混淆了列表和哈希。列表基本上是一个数组...它是一组按数字索引的元素。它的元素只能通过索引访问:

my $list = [ 'foo', 'bar', 'baz' ];
print $list->[0], "\n";   #prints foo
print $list->[2], "\n";   #prints baz

哈希是一个由您决定的键索引的集合。通过此键查找元素(与列表中的索引相反):

my $hash = { fookey => "foo", barkey => "bar", bazkey => "baz" };
print $hash->{'fookey'}, "\n";  # prints foo
print $hash->{'barkey'}, "\n";  # prints bar

如果我正确理解您的要求,您正在寻找一种以以下形式存储数据的方法:

patchname1 --relies on--> patchname2, patchname2, ...

所以你真正想要的是一个散列,其中键是补丁名称,值是补丁名称列表:

my $patch_hash = {
    patchname1 => [ 'patchname2', 'patchname4' ],
    patchname2 => [ 'patchname3', 'patchname4' ],
    patchname3 => [ 'patchname4' ],
    patchname4 => [],
};

每个唯一的补丁名称都是

patch_hash
中的键,其值是其依赖项列表。

正如 toolic 所建议的,如果你告诉它要分割的分隔符,则可以使用

split
来完成实际的解析。从那里,您可以使用以下内容填充哈希:

my $patch_hash = {};
while( <FILE> ){
    my( $name, @subs ) = split /[\s,]+/;
    push( @{$patch_hash->{$name}}, @subs );
}

这是一篇关于 Perl 数组的好文章。

这是一个很好的 Perl 数组函数列表。

这是一篇关于 Perl 哈希的好文章。

这是 Perl 正则表达式的一个很好的总结。

© www.soinside.com 2019 - 2024. All rights reserved.