如何确定Perl哈希是否是多维的?

sen*_*nel 5 perl hash

假设我有这样的哈希:

$hash_ref = {

  'hashes' => {
    'h1' => { 'klf' => '1', 'moomooland' => '1' },
    'h2' => { 'klf' => '2', 'moomooland' => '2' },
    'h3' => { 'klf' => '3', 'moomooland' => '3' }
  },

  'keys' => {
    'k1' => 'key1',
    'k2' => 'key2',
    'k3' => 'key3'
  }

}
Run Code Online (Sandbox Code Playgroud)

我怎么能尽可能容易地找到包含3个键/值对的hashes3个哈希keys值?

ref将返回HASH他们两个,我不知道是否有可能找出这些哈希的深度.

谢谢 :)

Eug*_*ash 5

如果您只需要知道散列是否是多维的,则可以迭代其值并在找到引用时停止:

my $is_multi_dimensional = 0;

for my $value (values %$hash_ref) {
    if ('HASH' eq ref $value) {
        $is_multi_dimensional = 1;
        last;
    }
}
Run Code Online (Sandbox Code Playgroud)

或者你可以使用这个each()功能:

while (my (undef, $value) = each %$hash_ref) {
    if ('HASH' eq ref $value) {
        $is_multi_dimensional = 1;
        last;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @tsee:对于更大的哈希值更有效,因为它不会创建值的中间列表.而且这是获得非常大(例如并列)哈希的唯一方法.当然,应该记住,根据设计,程序中的每个哈希都有一个迭代器. (2认同)

dra*_*tun 5

您还可以firstgrep此:

use List::Util 'first';
say 'is multi-dimensional' if first { ref } values %$hash_ref;

# explicitly check for HASH ref this time
my $how_many_md_hashes = grep { 'HASH' eq ref } values %$hash_ref;
Run Code Online (Sandbox Code Playgroud)

NB.first(List::Util核心模块的一部分)短路因此是条件的理想选择,可能是所有可能选项中最快的.

/ I3az /

  • 如果你只关心真实性而不是匹配的实际值,你可以使用'any'而不是'first':`use List :: MoreUtils'any'; my $ is_multi_dimensional = any {ref} values%$ hash_ref;` (2认同)