Perl数组和哈希引用处理

时间:2013-12-17 09:24:45

标签: arrays perl hash reference refs

我的问题是我在脚本末尾没有输出.. 解析时的所有打印都没问题,但最后的数组是空的。

我做错了什么? 这不是处理裁判的方法吗?

thx 4回应

my %branches = ();
print "<pre>";
my %tmp_branch;

while (defined($_ = shift @bugs)) {
    my $bug_id = $_->id;
    my $bug_product = $_->product;
    my $content = $browser->get("http://****?ticket=".$bug_id);
    $content = $content->decoded_content;

    my @rows = split /\n/, $content;
    my $trigger = 0;

    while (defined($_ = shift @rows)) {
        chomp;
        if ($_ eq "") {
            $trigger = 0;
        }
        elsif (/Branch: (.*)/) {
            if (exists $branches{$1}) {
                my $branch_ref = $branches{$1};
                %tmp_branch = %$branch_ref;
                print "existing Branch: $1\n";
            } else {
                my %new_branch = ();

                my @sources = ();
                my @wfs = ();
                my @methods = ();

                $new_branch{'sources'} = \@sources;
                $new_branch{'methods'} = \@methods;
                $new_branch{'wfs'} = \@wfs;

                $branches{$1} = \%new_branch;
                %tmp_branch = %new_branch;
                print "new Branch: $1\n";
            }
        }
        elsif (/Sourcen.*:/) {
            $trigger = "sources";
        }
        elsif (/geaenderte Methoden.*:/) {
            $trigger = "methods";
        }
        elsif (/geaenderte Workflows.*:/) {
            $trigger = "wfs";
        }
        elsif ($trigger && $_ ne "") {
            my $tmp_array_ref = $tmp_branch{$trigger};
            my @tmp_array = @$tmp_array_ref;
            push @tmp_array, $_;
            print "find $trigger: $_\n";
        }
    }
}

print "\n\n\n";

while (my ($k,$v)=each %branches){
    my $branch_ref = $v;
    my %tmp_branch = %$branch_ref;
    my $sources_ref = $tmp_branch{'sources'};
    my @sources = @$sources_ref;
    my $methods_ref = $tmp_branch{'methods'};
    my @methods = @$methods_ref;
    my $wfs_ref = $tmp_branch{'wfs'};
    my @wfs = @$wfs_ref;

    print "Branch: $k\nSources:\n";
    print @sources;
    print "\nMethods:\n";
    print @methods;
    print "\nWorkflows:\n";
    print @wfs;
    print "\n";
}

print "</pre>";

示例输入:

    Kontext Auswertung fuer Ticket: #12345 (xxxxSomeTextxxx)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    HINWEIS: xxxxSomeTextxxx

    Branch: HEAD
    ~~~~~~~

    Sourcen (4):
    IamArow
    IamArow2
    IamArow3
    IamArow4

    geaenderte Methoden (1):
    IamArow

    geaenderte Workflows (2):
    IamArow
    IamArow2

1 个答案:

答案 0 :(得分:2)

在没有任何输入数据的情况下很难弄明白,因为这意味着我们无法在自己的机器上运行脚本的副本!如果您的示例代码 自包含 ,通常非常有用!

那就是说,我认为你的问题源于做这样的事情:

my $branch_ref = $branches{$1};
%tmp_branch = %$branch_ref;

第二行执行散列的浅拷贝,因此%tmp_branch不再是$branches{$1}引用的散列。将数据添加到%tmp_branch哈希时,您不会将数据添加到$branches{$1}哈希。

@tmp_array同样受到影响。