问题描述
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'
}
};