2017-04-18 171 views
1

我有两个等长的数组,其中一个包含键,另一个包含值。如何在perl中创建两个数组的哈希映射(键值对)

如何使它们成为一个散列,我可以通过hash {key}访问它并获取值。

我试图

 my %hash = map { $key[$_], $values[$_] } 0..$#key; 

,但它有点在一个长长的清单,每一个第二个值是值,你可以从调试器中看到保存的一切。

DB<104> x %hash 
0 'linking_parameter_1' 
1 '$$SHIBBOLETH' 
2 'service_type' 
3 'getFullTxt' 
4 'crossref_supported' 
5 'Yes' 
6 'parser' 
7 'Bulk::BULK' 
8 'internal_name' 
9 'ELSEVIER_SD_EBOOK-COMPLETE_COLLECTION_1995-20065' 
10 'object_lookup' 
11 'yes' 
12 'linking_level' 
13 'BOOK' 
14 'displayer' 
15 'FT::NO_FILL_IN' 
16 'parse_param' 
17 '' 

当我键入

x %hash{parser} 

无法评估这一点。也许我只是不想以正确的方式访问它?

+0

散列一个参考只是一个列表。如果您希望调试器以键/值形式显示它,则需要给它一个参考。 'x \%hash'。 – simbabque

+0

%hash {parser}应该是$ hash {parser}。 – Shiping

+0

更快,更简单:'my%hash; @hash {@key} = @values;' – ikegami

回答

1

Perl调试器中的x命令取值为一个列表。由于列表上下文中的散列只是一个值列表,因此它不能看到有键/值对。如果您希望将输出视为成对,请将其传递给您的散列。

$ perl -d -e 'my %hash = foo => 123; sleep 1;' 
Loading DB routines from perl5db.pl version 1.44 
Editor support available. 

Enter h or 'h h' for help, or 'man perldebug' for more help. 

main::(-e:1): my %hash = foo => 123; sleep 1; 
    DB<1> s 
main::(-e:1): my %hash = (foo => 123); sleep 1; 
    DB<1> x %hash 
0 'foo' 
1 123 
    DB<2> x \%hash 
0 HASH(0x122e9c8) 
    'foo' => 123 
    DB<3> 

如果要访问单个散列元素,请使用正确的印记。要访问标量值,印记总是为$

DB<2> x $hash{foo} 
0 'foo' 
1 123 

但是,这样做%hash{foo}应该工作太多,如果你没有use strictuse warnings做。当然你不想这样做。

+1

我想知道'sleep'是干什么用的? – Borodin

+0

@Borodin我需要一些东西,所以我可以阻止它输出值。否则,它会立即完成。 – simbabque

6

使用散片定义它

my %hash; 
@hash{@key} = @values; 

但是从调试器输出的是你应该期待什么作为哈希被传递给x之前扩大成一个键/值列表。要查看复合数据的内部结构,你应该传递给x

DB<104> x \%hash 
0 HASH(0xe7c88880) 
    'linking_parameter_1' => '$$SHIBBOLETH' 
    'service_type' => 'getFullTxt' 
    'crossref_supported' => 'Yes' 
    'parser' => 'Bulk::BULK' 
    'internal_name' => 'ELSEVIER_SD_EBOOK-COMPLETE_COLLECTION_1995-20065' 
    'object_lookup' => 'yes' 
    'linking_level' => 'BOOK' 
    'displayer' => 'FT::NO_FILL_IN' 
    'parse_param' => '' 
+0

我个人将无法在MacBook上写入散列切片线。 :( – simbabque