perl中的哈希操作

时间:2012-02-08 16:53:49

标签: perl

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

patchname subpatch1,subpatch2,subpatch3 ...

要读取文件的内容,并将子补丁放在数组中。现在这些子补丁可能包含更多需要使用DFS或BFS遍历的子补丁。 但是这些子补丁需要映射到散列,而这些是从文件中读取的,即

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

使用拆分无效

($a1,$2)=split;

给了我$ 2 = subpath1,subpatch2,......需要进一步拆分..因为我是perl的新手,所以特别令人困惑。

是否有更好的方法来执行上述操作,或者是否有任何模块可以实现此操作。任何建议都会有很大帮助。

2 个答案:

答案 0 :(得分:4)

您可以拆分多个分隔符:

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

perldoc -f split

答案 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.

This is a nice article on Perl hashes.

And this is a nice summary of Perl regex.