简单的perl迭代从一行中的子程序返回的哈希?

时间:2015-12-28 21:26:49

标签: perl hash

假设我有一个返回哈希结果的子程序。我想从父目录中的子例程迭代键/值对,并且不想首先将结果保存到变量。

这看似简单,但我不知道怎么做。如果该方法返回一个哈希,我不知道告诉循环期望从该方法返回一个哈希所需的语法。如果方法返回hashref,我可以做

type slv_array is array (natural range <>) of std_logic_vector;

function in_array(val : std_logic_vector; set : slv_array) return boolean is
begin
  for idx in set'range loop
    if val = set(idx) then
      return TRUE;
    end if;
  end loop;
  return FALSE;
end function;

...

if in_array(data_in, (x"70", x"69", x"72", x"7A", x"6B", 
                      x"73", x"74", x"6C", x"75", x"7D")) then
  ...  -- if part of code
else
  ...  -- else part of code
end if;

但是这会在每次循环完成时重新运行generate_hash()方法,重新生成相同的散列,并重新处理散列的第一个元素(或者至少在5.10中执行.5.14允许每个都采用可以解决问题的标量,不确定,但我很遗憾地限于5.10。

任何人都可以解释我在这里遗漏的那种荒谬明显的语法吗?

3 个答案:

答案 0 :(得分:2)

use List::Util 1.29 'pairs';

for my $kv ( pairs %{ genHash() } ) {
    my ($key, $value) = @$kv;
    ...
}

答案 1 :(得分:0)

根据免责声明,评论者是正确的,这是一个坏主意,你可以

  1. 将作业放在%{...}演员表中。仍然没有可读性,除非你能将my声明与之前的声明结合起来,否则不会使代码更简洁:

    my $foo;
    while (my ($k,$v) = each %{$foo //= generate_hash}) { ... }
    
  2. 确保generate_hash每次调用时都返回对相同哈希的引用。这样,与哈希相关联的迭代器将被重用并为您提供一个新密钥。当然,最简单的方法是使用变量:

    my $cached_generated_hash;
    sub generate_hash {
        return $cached_generated_hash //= do {
           ...
           { abc => 123, def => 456 }
        };
    }
    

答案 2 :(得分:0)

同意@mob&amp;评论者,以下仅供娱乐。虽然我会感兴趣,如果任何人都可以像一个“荒谬简单的语法”那样远程地拿出一些东西来做这件事: - )

哦,是的,请注意genHash()的单一调用。

$ ./foo.pl
Hello from genHash()
a=beta
a=2
a=alpha
a=1
a=gamma
a=3

$ cat ./foo.pl
#!/usr/bin/perl

use strict;

sub genHash() {
   print "Hello from genHash()\n";
   return { alpha => 1, beta => 2, gamma => 3 };
}

# There comes a point when you have to ask
# why you are even trying to swim upstream :-)
# ----- edit as per comments to remove unnecessary reference.
# original: foreach my $a ( %${ \( genHash() ) } ) {
# ------------------------------
foreach my $x ( %{ genHash() } ) {
   print "x=", $x, "\n";
}

$