1

我对 Perl 和取消引用有一个奇怪的问题。

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

[Common]
animals =<<EOT
dog
cat
EOT

[ACME]
animals =<<EOT
cayote
bird
EOT

我有一个子例程将 INI 文件读入 %INI 哈希并处理多行条目。

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

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

'Common' 数组工作正常,即如果$org不是 'ACME' 我得到值(狗猫)但如果$org等于 'ACME'` 我得到 2 的值?

有任何想法吗??

4

1 回答 1

6

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

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

perldoc 页面甚至专门列出了这个perlop例子:

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}};
于 2012-08-24T11:31:06.230 回答