假设我有一个返回哈希结果的子程序。我想从父目录中的子例程迭代键/值对,并且不想首先将结果保存到变量。
这看似简单,但我不知道怎么做。如果该方法返回一个哈希,我不知道告诉循环期望从该方法返回一个哈希所需的语法。如果方法返回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。
任何人都可以解释我在这里遗漏的那种荒谬明显的语法吗?
答案 0 :(得分:2)
use List::Util 1.29 'pairs';
for my $kv ( pairs %{ genHash() } ) {
my ($key, $value) = @$kv;
...
}
答案 1 :(得分:0)
根据免责声明,评论者是正确的,这是一个坏主意,你可以
将作业放在%{...}
演员表中。仍然没有可读性,除非你能将my
声明与之前的声明结合起来,否则不会使代码更简洁:
my $foo;
while (my ($k,$v) = each %{$foo //= generate_hash}) { ... }
确保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";
}
$