【问题标题】:how to make a hash map (key value pair) from two arrays in perl如何从perl中的两个数组制作哈希映射(键值对)
【发布时间】:2017-09-14 02:40:28
【问题描述】:

我有两个长度相等的数组,一个包含键,另一个包含值。

如何将它们变成一个哈希,我可以通过 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}

它无法评估。也许我只是没有尝试以正确的方式访问它?

【问题讨论】:

  • 哈希只是一个列表。如果您希望调试器以键/值形式显示它,您需要给它一个参考。 x \%hash.
  • %hash{parser} 应该是 $hash{parser}。
  • 更快、更简单:my %hash; @hash{@key} = @values;

标签: perl hash hashmap


【解决方案1】:

使用散列切片来定义它

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

但调试器的输出是您所期望的,因为哈希在传递给x 之前已扩展为键/值列表。要查看复合数据的内部结构,您应该将 reference 传递给 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' => ''

【讨论】:

  • 我个人无法在 MacBook 上编写该哈希切片行。 :(
【解决方案2】:

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

但是,如果您没有 use strictuse warnings,则执行 %hash{foo} 也应该有效。你当然不想那样做。

【讨论】:

  • @Borodin 我需要一些东西,所以我可以阻止它输出值。否则它会立即结束。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 2015-09-21
  • 2011-08-11
  • 2014-10-06
  • 2011-10-04
相关资源
最近更新 更多