【问题标题】:Perl: using array to create hash of hash structurePerl:使用数组创建散列结构的散列
【发布时间】:2017-02-10 04:07:43
【问题描述】:

在我检索的循环内

  • 数组(其长度和数据可能在每次迭代时发生变化)
  • 1 个数据名称
  • 1 个数据值

我想创建一个散列的散列,将数组作为结构,并在最后设置检索到的数据。

如果我有示例:

@array = ('a','b','c');
$dataname = 'my data';
$datavalue = '123';

我想要一个如下的哈希:

%hash = (
     a => {
           b => {
                 c => {
                       'my data' => '123'
                      }
                }
          }
          );

但我没有找到任何方法。

【问题讨论】:

标签: arrays perl hash


【解决方案1】:
use Data::Diver qw( DiveVal );

DiveVal(\%hash, map \$_, @array, $dataname) = $datavalue;

或者,

sub DiveVal :lvalue {
   my $p = \shift;
   $p = \( $$p->{$_} ) for @_;
   $$p
}

DiveVal(\%hash, @array, $dataname) = $datavalue;

【讨论】:

  • @Hunter McMillen,Explanation of the above code。特别是,请阅读“额外的间接级别有很多好处”部分。
  • @Hunter McMillen, sub { my $r = shift; $r &&= $r->{$_} for @_; $r } 如果您想从结构中获取,那会很好,但是由于我们要添加到结构中,所以我们最终需要引用最后一个值。您可以通过专门处理最后一个键来做到这一点,但是额外的间接级别使事情变得更加容易。
  • @Hunter McMillen, This 做了类似的事情,但使用别名而不是引用。使用 Data::Alias 的别名:sub DiveVal :lvalue { alias my $s = shift; alias $s = $s->{$_} for @_; $s }。使用refaliasing 功能的别名:sub DiveVal :lvalue { \my $s = \shift; \$s = \( $s->{$_} ) for @_; $s }
  • @ikegami,您的解决方案看起来不错,但不幸的是,该脚本必须在我无法安装任何其他模块且该模块在目标计算机上不可用的系统上运行。我将尝试找到其他解决方案而不以这种方式创建哈希
【解决方案2】:

你可以这样做,它不是最有效的,但它有效

use Data::Dumper;

my @array = ('a','b','c');
my $dataname = 'my data';
my $datavalue = '123';

my $hash = {$dataname => $datavalue};

foreach my $item (reverse @array){
    $hash = {$item =>$hash};
}
my %hash =%$hash;
print Dumper(\%hash);

你会得到以下输出:

$VAR1 = {
          'a' => {
                   'b' => {
                            'c' => {
                                     'my data' => '123'
                                   }
                          }
                 }
        };

【讨论】:

    猜你喜欢
    • 2013-07-19
    • 2012-08-03
    • 2014-09-28
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 2014-05-19
    • 2013-02-05
    • 2015-11-16
    相关资源
    最近更新 更多