数组引用与标量引用

时间:2015-04-30 17:03:28

标签: arrays perl

我有这个代码段来组合我将传递给函数的参数哈希。包含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'

它看起来像是对阵列的引用,所以我不确定我哪里出错了。

2 个答案:

答案 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",
}