如何在perl中从子程序返回多个值

如何在perl中从子程序返回多个值,perl,Perl,我正在尝试读取separte子例程中的配置文件,并尝试在我的主函数中调用它。子例程返回三个变量(两个数组和一个散列) sub read_config{ my @keys; my @dbkeys; my %config; open CONFILE,'/usr/local/pbiace/current/comparator/cfg/configFile.cfg' or die $!; warn info_H . "opening config file \n "; warn info_H .

我正在尝试读取separte子例程中的配置文件,并尝试在我的主函数中调用它。子例程返回三个变量(两个数组和一个散列)

sub read_config{
my @keys; 
my @dbkeys; 
my %config; 
open CONFILE,'/usr/local/pbiace/current/comparator/cfg/configFile.cfg' or die $!; 
warn info_H . "opening config file \n ";
warn info_H . "reading postion info";
@keys=split '\|',<CONFILE>; 
(  $config{$keys[0]}, 
   $config{$keys[1]}, 
   $config{$keys[2]}, 
   $config{$keys[3]}, 
   $config{$keys[4]}, 
   $config{$keys[5]},
   $config{$keys[6]},
   $config{$keys[7]}) = split '\|',<CONFILE>; 
warn info_H. "reading config file to obatin DB connection details"; 
@dbkeys=split '\|',<CONFILE>; 
(  $config{$dbkeys[0]}, 
   $config{$dbkeys[1]}, 
   $config{$dbkeys[2]}, 
   $config{$dbkeys[3]} ) = split '\|',<CONFILE>; 
warn info_H . "returning values read";
return(@keys,@dbkeys,%config);
}

但这不起作用。有人能帮我解决这个问题吗?

这里的问题是,perl在来回传递列表时会压扁列表。您只能返回一个结果列表。见:

因此,对
@keys
的赋值将“吃掉”来自
read_config
的所有结果,它不会返回3个数据结构,而是返回一个,其中包含每个数据结构中的所有元素

解决方法是通过引用返回

return ( \@keys, \@dbdkeys, \%config ); 
然后,您需要在“获取”它们时取消引用它们:

my ($keys_ref, $dbkeys_ref, $config_ref)=read_config();

@keys = @$keys_ref;
@dbkeys = @$dbkeys_ref;
%config = %$config_ref; 
或者只是按原样使用它们,并在使用它们时取消引用

$keys -> [0];
$config -> {$key};
我还想指出-您应该查看哈希,因为这可能会改进您的代码-您可以分配:

@config{@keys} = split ( '\|', <CONFILE> ); 
@config{@keys}=split('\\\',);

(但是如果你不想换行,别忘了
chomp

嗨,我试过上面的代码。它抛出了下面的错误。不是比较器_sub.pl第73行的数组引用。第73行包含@dbkeys=@$dbkeys\u ref@nithin您是否将子例程中的
返回
更改为实际返回引用?我怀疑没有…是的。那是个错误。我没有返回一个数组的引用。它正在工作。非常感谢。
@config{@keys} = split ( '\|', <CONFILE> );