我有一个场景,需要一些帮助。我正在编写一个需要执行一些验证的perl脚本。我有一个可用的文件,其中包含以下信息
patchname subpatch1,subpatch2,subpatch3 ...
要读取文件的内容,并将子补丁放在数组中。现在这些子补丁可能包含更多需要使用DFS或BFS遍历的子补丁。 但是这些子补丁需要映射到散列,而这些是从文件中读取的,即
$list->{subpatch1} = \subpatch1
$list->{subpatch2} = \subpatch2
$list->{subpatch3} = \subpatch3 ....
使用拆分无效
($a1,$2)=split;
给了我$ 2 = subpath1,subpatch2,......需要进一步拆分..因为我是perl的新手,所以特别令人困惑。
是否有更好的方法来执行上述操作,或者是否有任何模块可以实现此操作。任何建议都会有很大帮助。
答案 0 :(得分:4)
答案 1 :(得分: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, ...
所以你真正想要的是一个哈希,其中键是补丁名称,值是patchnames列表:
my $patch_hash = {
patchname1 => [ 'patchname2', 'patchname4' ],
patchname2 => [ 'patchname3', 'patchname4' ],
patchname3 => [ 'patchname4' ],
patchname4 => [],
};
其中每个唯一的patchname是patch_hash
中的一个键,其值是其依赖项的列表。
正如工具所暗示的那样,如果你告诉它要拆分的分隔符,可以使用split
进行实际的解析。从那里,您可以使用以下内容填充哈希:
my $patch_hash = {};
while( <FILE> ){
my( $name, @subs ) = split /[\s,]+/;
push( @{$patch_hash->{$name}}, @subs );
}
This is a nice article on Perl arrays.
This is a nice list of the functions for Perl arrays.