将数组按值传递给Perl中的哈希值?

时间:2017-08-23 13:25:28

标签: perl

我是Perl中的新手并尝试了一些东西。我注意到的一件事是,如果想要将数组作为hashmap键的值传递,一种方法是通过引用传递它。如下

years = ['2014', '2015', '2016']
for year in years :
   df1 = pd.read_excel(year +'.xlsx')

有没有办法直接按值传递数组? 感谢

2 个答案:

答案 0 :(得分:4)

哈希将字符串(键)映射到标量值。哈希中的值只能是标量。

数组不是(按照定义!)标量。获取表示该数组的标量值的最佳方法是获取对该数组的引用。这就是你的代码所做的。这就是你应该怎么做的。

还有其他方法可以创建标量值来表示数组。例如,您可以使用join()从数组元素创建一个字符串。但这将非常脆弱,因为您需要找到一个不出现在任何元素中的分隔符。

就像你正在做的那样,更好地选择参考。

更新:为了澄清,有三种方法可以通过参考进行此操作。

  • $hash{key} = \@array - 获取对数组的引用并将引用存储在$hash{key}中。
  • $hash{key} = [ @array ] - 将数组展开到列表中,使用该列表作为元素创建一个新数组,并返回对此新数组的引用(有效复制数组)。
  • @{$hash{key}} = @array - 这也会获取数组的副本并存储对副本的引用。

答案 1 :(得分:0)

在perl 5.10和5.14下,以下对我来说很好:

use strict;
use Data::Dumper;

my @array= qw(foo 42 bar);
my %hash;
@{ $hash{key} } = @array;
$hash{key} = [ @array ]; #same as above line
print Dumper(\%hash,$hash{key}[1]);

输出(您的订单可能会有所不同):

$VAR1 = {
          'key' => [
                     'foo',
                     '42',
                     'bar'
                   ]
        };
$VAR2 = '42';

我更喜欢@{ $hash{key} }语法,因为你可以推送/弹出它,即

push @{ $hash{key} }, "value";

这是非常方便的(对我来说无论如何)
此外,使用此语法,您正在复制数组,而不仅仅是对它进行引用,这意味着您可以更改原始数组而不会影响哈希