我正在编写一个 Perl 脚本,需要执行一些验证。我有一个可用文件,其中包含以下信息
patchname subpatch1,subpatch2,subpatch3...
要读取文件内容并将子补丁放入数组中。这些子补丁可能包含更多需要使用稍后出现的 DFS 或 BFS 进行遍历的子补丁。 但是,当从文件中读取这些子补丁时,需要将这些子补丁映射到哈希,即:
$list->{subpatch1} = \subpatch1
$list->{subpatch2} = \subpatch2
$list->{subpatch3} = \subpatch3 ....
使用
split
没有帮助。
($a1,$2)=split;
给了我
$2=subpath1,subpatch2,...
,需要进一步拆分。这里真的很令人困惑,特别是因为我是 Perl 新手。
是否有更好的方法来执行上述操作,或者是否有任何模块可以实现此目的?
我认为您混淆了列表和哈希。列表基本上是一个数组...它是一组按数字索引的元素。它的元素只能通过索引访问:
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 );
}