2012-08-24 23 views
1

我对Perl和解引用有一个奇怪的问题。Perl:解引用数组是否使用标量上下文?

我有两个不同部分下的数组值的INI文件,例如

[Common] 
animals =<<EOT 
dog 
cat 
EOT 

[ACME] 
animals =<<EOT 
cayote 
bird 
EOT 

我有一个子例程来读INI文件到%INI散列并应付多行条目。

然后,我使用一个$org变量来确定我们是使用公用数组还是特定的组织数组。

@array = @{$INI{$org}->{animals}} || @{$INI{Common}->{animals}}; 

“共同”阵列正常工作,即,如果$org是什么,但“ACME”我得到的值(狗猫),但如果$org等于“ACME'`我得到的2回值?

任何想法??

回答

6

取消数组当然不会强制标量上下文。但使用||是。因此,像$val = $special_val || "the default";这样的东西很好用,而你的例子没有。

因此,@array将包含单个数字(第一个数组中的元素数)或者如果是0,则包含第二个数组的元素。

perlop的perldoc页甚至列出这个例子speficially:

In particular, this means that you shouldn't use this for selecting 
between two aggregates for assignment: 

    @a = @b || @c;    # this is wrong 
    @a = scalar(@b) || @c;  # really meant this 
    @a = @b ? @b : @c;   # this works fine, though 

取决于你想要什么,该解决方案可能是:

my @array = @{$INI{$org}->{animals}} 
    ? @{$INI{$org}->{animals}} 
    : @{$INI{Common}->{animals}}; 
+0

增加了一个解决方案。 – ikegami

+0

谢谢,在我发现这个网站之前,我不知道该怎么处理:)。 – andyml73

相关问题