我正在尝试在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();
但这不起作用。有人帮我解决这个问题吗?
答案 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
。)