Perl:Hash是否可以存储混合变量?

时间:2013-06-26 10:33:58

标签: arrays perl hash merge

快速提问: 我想将以下变量存储在Hash中:

my %hash1;
my %hash2;
my %hash3;
my @array1;
my @array2;
my @array3;

最终结果是:

Hash
    hash1Name
             {key1=>val1,key2=>val2}
    hash2Name
             {key1=>val1,key2=>val2}
    hash3Name
             {key1=>val1,key2=>val2}
    array1Name
             [element1,element2,...]
    array2Name
             [element1,element2,...]
    array3Name
             [element1,element2,...]

为什么我要这样做: 那么这都是在一个函数(sub)中完成的,所以想要在一个哈希中返回所有数据。

这可能吗?

创建一个可以容纳这些变量的类会不会更好?

由于

3 个答案:

答案 0 :(得分:3)

您可以在散列或数组中存储任何标量。标量包括对数组或散列的引用:

my $hash = {
  hash1Name => \%hash1,
  hash2Name => \%hash2,
  hash3Name => \%hash3,
  array1Name => \@array1,
  array2Name => \@array2,
  array3Name => \@array3,
}

Perl没有类型系统,如果你想这样做会妨碍你。但是,程序员现在负责正确处理哈希的内容,无论其类型如何。如果它能够实现更清洁的设计,您可以使用OO。但请注意

  1. 底层对象通常会通过这样的哈希来实现
  2. OO为了OO的缘故,当基本数据结构足够时,不必要地使代码复杂化。

答案 1 :(得分:2)

是的,有可能,最容易用词汇变量完成:

sub mysub {
    my %hash1;
    my %hash2;
    my %hash3;
    my @array1;
    my @array2;
    my @array3;
    ...
    my %all = (
         hash1  => \%hash1,
         hash2  => \%hash2,
         array1 => \@array1,
         # etc
    );
    return \%all;
}

返回单个标量值,该值是包含所有数据的哈希引用。

答案 2 :(得分:1)

my %Hash = (
   hash1Name  => \%hash1,
   hash2Name  => \%hash2,
   hash3Name  => \%hash3,
   array1Name => \@array1,
   array2Name => \@array2,
   array3Name => \@array3,
);

但是你可能想要一个哈希引用:

my $Hash = {
   hash1Name  => \%hash1,
   hash2Name  => \%hash2,
   hash3Name  => \%hash3,
   array1Name => \@array1,
   array2Name => \@array2,
   array3Name => \@array3,
};