我正在弄清楚如何正确地对返回多个值的子例程进行语法化。假设我们有一个具有以下格式的文件,我要从中解析值:
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 ...
恐怕这一切都相当混乱。我认为主要问题是您对全局变量的使用。子例程仅应使用作为参数传递或在其中定义的变量。同样,在三个不同的哈希中存储有关动物的数据也是灾难的根源。如您所见,您不能保证会保留其他哈希值。
但是我的命令使输出顺序完全混乱。关于我的代码中出现什么错误的任何想法都可能导致此错误?