如何从perl中的子例程返回多个值

时间:2015-11-24 11:42:38

标签: perl

我正在尝试在separte子例程中读取配置文件并尝试在我的main函数中调用它。子例程返回三个变量(两个数组和一个哈希).Below是代码。

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);
}

我使用下面的代码调用它。

(@keys,@dbkeys,%config)=read_config();

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

1 个答案:

答案 0 :(得分:4)

这里的问题是perl squashes列表来回传递时。您只能返回一个结果列表。请参阅:perlsub

因此,对@keys的分配将是“吃饭”。来自read_config的所有结果,它不返回3个数据结构 - 它返回一个,包含每个数据结构中的所有元素。

对此的解决方案是通过引用返回。

return ( \@keys, \@dbdkeys, \%config ); 

然后,当您获得&#39;时,您需要取消引用它们。它们:

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

@keys = @$keys_ref;
@dbkeys = @$dbkeys_ref;
%config = %$config_ref; 

或者只是按原样使用它们,并在使用它们时取消引用。

$keys -> [0];
$config -> {$key};

我还要指出 - 您应该查看哈希slices,因为这可能会改善您的代码 - 您可以指定:

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

(但如果您不想换线,请不要忘记chomp。)