在Perl中通过子例程返回多个值后,输出顺序有问题

问题描述 投票:0回答:2

我正在弄清楚如何正确地对返回多个值的子例程进行语法化。假设我们有一个具有以下格式的文件,我要从中解析值:

Id: Animal1
Loc: Area1
Similarity: 15/20

Id: Animal2
Loc: Area2
Similarity: 19/20

Id: Animal3
Loc: Area3
Similarity: 13/20

由于我有几个文件要在同一脚本中运行,所以我想以子例程的形式读取它们。但是,我的命令使输出顺序完全混乱。关于我的代码中出现什么错误的任何想法都可能导致此错误?

这里是不以子例程格式运行的代码,从我打开文件后开始:

open($fh, "<", $animal1) || die "Could not open file $animal1/n $!";

while (<$fh>) {
    chomp;
    if($_ =~ /Id:\s+(\S+)/){
        $id= $1;

    }
    if($_ =~ /Loc:\s+(\S+)/){
        $loc{$id}= $1;
    }
    if($_ =~ /Similarity:\s+(\S+)/){
        $simil{$id}= $1;
    }
}

foreach $id(keys %loc){
    print "The $animal is found in $loc{$animal} and is $simil{$animal} similar\n";
}
close $fh;

相关代码:

open($fh, "<", $animal1) || die "Could not open file $animal1/n $!\n";

while (<$fh>) {
    chomp;
    ($animal, $loc{$animal}, $simil{$animal})= parse_key_file($_);
}

foreach $animal(keys %loc){
    print "The $animal is found in $loc{$animal} and is $simil{$animal} similar\n";
}

sub parse_key_file {
    if($_ =~ /Id:\s+(\S+)/){
        $id= $1;
        next;
    }
    if($_ =~ /Loc:\s+(\S+)/){
        $loc{$id}= $1;
        next;
    }
    if($_ =~ /Similarity:\s+(\S+)/){
        $simil{$id}= $1;
        next;
    }
    return ($id, $loc{$id}, $simil{$id});
}

谢谢!甲。

我正在弄清楚如何正确地对返回多个值的子例程进行语法化。假设我们有一个具有以下格式的文件,我要从中解析值:Id:Animal1 ...

perl parsing hash subroutine
2个回答
2
投票

恐怕这一切都相当混乱。我认为主要问题是您对全局变量的使用。子例程仅应使用作为参数传递或在其中定义的变量。同样,在三个不同的哈希中存储有关动物的数据也是灾难的根源。如您所见,您不能保证会保留其他哈希值。


0
投票

但是我的命令使输出顺序完全混乱。关于我的代码中出现什么错误的任何想法都可能导致此错误?

© www.soinside.com 2019 - 2024. All rights reserved.