【问题标题】:How do I convert an array or a list into a hashref?如何将数组或列表转换为 hashref?
【发布时间】:2021-09-29 04:51:20
【问题描述】:

我有一个这样的列表:

my $myV3VersionOfData = ["ZG","ZB","CXLDN",...];

我想把它转换成这样的字典:

my $entries = {
'ZG' => {
'value' => 'ZG'
},
'ZB' => {
'value' => 'ZB'
},
'CXLDN' => {
'value' => 'CXLDN'
},
...
};

到目前为止,我尝试了这个,但它不起作用并给我一个错误:

不能将字符串 ("ZG") 用作 HASH 引用,而 "strict refs" 正在使用 at..

我知道这是因为我试图从列表中分配键值,但是如何将此列表转换为上面显示的字典?

my %genericHash;
for my $entry (@$myV3VersionOfData) {
  $genericHash{ $entry->{key} } = $entry->{value};
}

我怎样才能做到这一点?我是 Perl 的新手,我尝试了很多东西,但似乎没有用。有人可以帮忙吗?

【问题讨论】:

    标签: arrays perl dictionary hashref arrayref


    【解决方案1】:

    你很亲密。这是从数组引用创建哈希引用的一种方法:

    use warnings;
    use strict;
    use Data::Dumper;
    $Data::Dumper::Sortkeys=1;
    
    my $myV3VersionOfData = ["ZG","ZB","CXLDN"];
    my $entries;
    for (@{ $myV3VersionOfData }) {
        $entries->{$_} = {value => $_};
    }
    
    print Dumper($entries);
    

    输出:

    $VAR1 = {
              'CXLDN' => {
                           'value' => 'CXLDN'
                         },
              'ZB' => {
                        'value' => 'ZB'
                      },
              'ZG' => {
                        'value' => 'ZG'
                      }
            };
    

    【讨论】:

    • 啊,非常感谢...我知道我哪里出错了
    【解决方案2】:

    如果你想遍历每个元素,计算一个新元素,那么你可以使用map 函数。作为map,可以返回多个值,你为每个条目返回两个值。这些可以转换为哈希。

    my $array   = ["ZG","ZB","CXLDN"];
    my %hash    = map { $_ => { value => $_ } } @$array;
    my $hashref = { map { $_ => { value => $_ } } @$array };
    

    【讨论】:

      【解决方案3】:

      这是我 10 多年来的做法。

      #! /usr/bin/perl
      use warnings;
      use strict;
      use Data::Dumper qw(Dumper);
      
      my %entries;
      my @myV3VersionOfData = ("ZG","ZB","CXLDN");
      foreach (@myV3VersionOfData) {
          $entries{$_}{'value'} = $_;
      }
      
      print Dumper \%entries;
      

      【讨论】:

        【解决方案4】:

        我们想要

        'ZG' => { 'value' => 'ZG' }      # Copied literally from the Question
        

        但是ZG部分是可变的,所以我们使用

        $_ => { 'value' => $_ }
        

        现在循环!

        my %genericHash = map { $_ => { 'value' => $_ } } @$myV3VersionOfData;
        
        my $entries = { map { $_ => { 'value' => $_ } } @$myV3VersionOfData };
        

        不清楚你想要哪一个。

        当然,也可以使用 foreach 循环来完成。

        my %genericHash;
        for (@$myV3VersionOfData) {
           $genericHash{$_} = { 'value' => $_ };
        }
        

        【讨论】:

          【解决方案5】:

          请研究以下代码 sn-p 以符合您的问题。

          use strict;
          use warnings;
          use feature 'say';
          
          use Data::Dumper;
          
          my $myV3VersionOfData = ['ZG','ZB','CXLDN'];
          my $hashref;
          
          $hashref->{$_}{value} = $_ for @$myV3VersionOfData;
          
          say Dumper($hashref);
          

          输出

          $VAR1 = {
                    'CXLDN' => {
                                 'value' => 'CXLDN'
                               },
                    'ZB' => {
                              'value' => 'ZB'
                            },
                    'ZG' => {
                              'value' => 'ZG'
                            }
                  };
          

          【讨论】:

            猜你喜欢
            • 2015-08-06
            • 1970-01-01
            • 1970-01-01
            • 2017-11-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多