我有这个代码段来组合我将传递给函数的参数哈希。包含IP地址的哈希值应该是一个数组引用,但是我传递参数的函数认为它是一个标量引用。
我的代码是:
my $paramList = "ldap_ip_addresses=['192.168.1.100']|ldap_port=389|ldap_protocol=ldap";
my @paramTuples = split(/\|/, $paramList);
my %nasProps;
foreach my $paramTuple (@paramTuples) {
my($key, $val) = split(/=/, $paramTuple, 2);
# SetProperties can also take hashes or arrays
my $eval_val = eval $val;
if (ref($eval_val) =~ /ARRAY/) {
$val = \$eval_val;
}
$nasProps{$key} = $val;
}
从调试器中,我的参数hash看起来像这样:
DB<18> x \%nasProps
0 HASH(0x303f8f0)
'ldap_authentication_type' => 'anonymous'
'ldap_ip_addresses' => REF(0x303fa70)
-> ARRAY(0x8284eb8)
0 '192.168.1.100'
'ldap_port' => 389
'ldap_protocol' => 'ldap'
它看起来像是对阵列的引用,所以我不确定我哪里出错了。
答案 0 :(得分:4)
由于$eval_val
已经是对数组的引用,因此无需引用该引用。变化:
$val = \$eval_val;
为:
$val = $eval_val;
答案 1 :(得分:1)
您不必要地使用
引用引用$val = \$eval_val;
您已在前一行中确定$eval_val
是对数组的引用,因此您可以按原样使用它,而无需再次引用它。
此外,您应该忽略ref $eval_val
的结果,除非检查它是 true - 即$eval_val
是某种类型的参考
您的代码看起来应该更像这样。仅当$val
返回eval
时,您才需要回退到原来的undef
值,通常意味着该字符串不是可编译的代码。
另请注意,您应为全局 Perl变量保留大写字母,例如包名称。词法变量标识符应仅包含小写字母,十进制数字和下划线。
use strict;
use warnings;
my $param_list = "ldap_ip_addresses=['192.168.1.100']|ldap_port=389|ldap_protocol=ldap";
my @param_tuples = split /\|/, $param_list;
my %nas_props;
for my $param_tuple (@param_tuples) {
my ($key, $val) = split /=/, $param_tuple, 2;
$nas_props{$key} = eval($val) // $val;
}
use Data::Dump;
dd \%nas_props;
<强>输出强>
{
ldap_ip_addresses => ["192.168.1.100"],
ldap_port => 389,
ldap_protocol => "ldap",
}