如何将数组或列表转换为 hashref?

问题描述

我有一个这样的列表:

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

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

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

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

不能使用字符串(“ZG”)作为 HASH 引用,而在使用“严格引用”时..

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

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

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

解决方法

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

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'
                  }
        };
,

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

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

以下是我 10 多年来的做法。

public class ClsPQHeap {
    private int back;
    private int heap[];

public ClsPQHeap (int amount){
    heap = new int[amount];
    back = 0;
}
public boolean isEmpty(){
    if (back == 0){
      return true;  
    } else {
      return false;  
    }
}
public boolean isFull(){
    if (heap.length == back){
        return true;
    } else {
        return false;
    }
}
// this is the method that needs help 
public void add(int x){
    if (isEmpty()) {
        heap[back] = x;
    } else if (isFull()){
      System.out.println("Did not add " + x + " array is full");
   } else {
        heap[back + 1] = x;
        for (int i = heap.length; i <= back; i--){
            if (heap[i] > heap[i-1]){
                int temp = heap[i];
                heap[i] = heap[i-1];
                heap[i-1] = temp;
            } else if (heap[i] < heap[i -1]){
                int temp = heap[i];
            }
        }
        /*do {
            if (heap[back] > heap[back+1]){
                int temp = heap[back];
                heap[back] = heap[back + 1];
                heap[back + 1] = temp;
            } else if (heap[back] < heap[back+1]){
            
            }
        } while (heap[0] > heap[back]); */
        back += 1;    
    } 
}
public void print(){
  int count = 1;
  for(int i = 0; i<back; i++){
     System.out.println(count + "." + heap[i]);
     count += 1;
  }
}
public static void main(String[] args) {
    
    int myArray[] = {15,5,8,4,9,22,17,2,14,1};
    ClsPQHeap heap = new ClsPQHeap(myArray.length);
    for(int i = 0; i<myArray.length; i++){
        heap.add(myArray[i]);
        heap.print();
        System.out.println("");
    }
}
}
,

我们想要

'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' => $_ };
}
,

请研究以下代码片段以符合您的问题。

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'
                     },'ZG' => {
                    'value' => 'ZG'
                  }
        };