【问题标题】:Hash operation in perlperl中的哈希运算
【发布时间】:2012-02-08 16:53:48
【问题描述】:

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

补丁名称 subpatch1,subpatch2,subpatch3...

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

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

使用拆分没有帮助

($a1,$2)=split;

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

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

【问题讨论】:

  • 很抱歉,您能否发布一个更长的文件版本。你说子补丁可能有更多的子补丁,但这是什么意思?这是否意味着 subpatch2 是 subpatch1 的子补丁?缩小你想要达到的目标;问题的核心是什么?

标签: perl


【解决方案1】:

您可以拆分多个分隔符:

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

perldoc -f split

【讨论】:

    【解决方案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 中的一个键,其值是其依赖项的列表。

    正如工具所暗示的,如果你告诉它要拆分的分隔符,则可以使用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.

    【讨论】:

    • 正是我想要的。非常感谢您理解需要什么,因为很难从帖子中弄清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 2013-08-10
    • 1970-01-01
    • 2011-06-14
    • 2015-08-01
    相关资源
    最近更新 更多