如何从函数返回值中使用Perl keys()?
我知道Perl如何从函数返回值中使用Perl keys()?,perl,hash,Perl,Hash,我知道Perlkeys()函数,并希望在我已有的散列中使用它,但我不认为有任何理由为它设置变量。让我用两种方式解释代码: 正常: my %hash = ReturnsHash(); foreach (keys(%hash)) { ...code... } 我想要的方式是: foreach (keys(ReturnsHash())) { ...code... } 使用第二种方法,我得到这个错误消息(键的arg1类型必须是散列或数组(不是子例程条目)),第二种方法可能吗?如果是,
keys()
函数,并希望在我已有的散列中使用它,但我不认为有任何理由为它设置变量。让我用两种方式解释代码:
正常:
my %hash = ReturnsHash();
foreach (keys(%hash)) {
...code...
}
我想要的方式是:
foreach (keys(ReturnsHash())) {
...code...
}
使用第二种方法,我得到这个错误消息(
键的arg1类型必须是散列或数组(不是子例程条目)
),第二种方法可能吗?如果是,怎么办?我想你已经知道了。从函数返回一个散列引用,然后在foreach
块中,键将存储在$\ucode>变量中。下面是一个例子:
sub ReturnsHash {
return { key1 => 'value1', key2 => 'value2' };
}
foreach (keys(%{ReturnsHash()})) {
print 'key:=' . $_ . "\n";
}
没有“返回散列”的函数。如果你有
sub foo {
...
return %hash;
}
my %h = foo();
然后foo不会“返回散列”;它返回%hash
中的键和值列表。该列表用于创建新的哈希%h
。正如Joel所说,如果您返回对散列的引用,那么keys%$href
是有意义的,但是您不能在列表上运行keys
,而不首先将其分配给散列。与其名称相反,ReturnsHash
不会返回散列。sub不可能返回哈希。SUB只能返回标量列表。如果你这样做
sub ReturnsHash {
my %hash = ( a => 1, b => 2 );
return %hash;
}
你在干什么
return 'a', 1, 'b', 2;
既然你做不到
keys('a', 1, 'b', 2)
keys(ReturnsHash())
你做不到
keys('a', 1, 'b', 2)
keys(ReturnsHash())
现在,您可以做的是返回对散列的引用
sub ReturnsHashRef {
my %hash = ( a => 1, b => 2 );
return \%hash;
}
阿卡
在这种情况下,你可以这样做
keys(%{ ReturnsHashRef() })
既然可以返回散列引用
,为什么还要返回整个庞大的散列
我总是希望返回一个散列引用
sub return_hash() {
## Code
return \%hash;
}
并将其作为
foreach (keys(%{ return_hash() })) {
## code
}
还有一件事,编写所有函数名总是被视为良好的编码约定,以小写字母开始,并通过\uu
分隔单词,这几乎完全可能是您编写函数名的方式。你试过这种方法吗?如果是,请解释它是如何失败的。我添加了错误,我还使用了5.012和warnings@cdhowie:这是一个5.14+的实验feature@Eric你用的是什么Perl版本?Perl pre-5.14可能需要您取消对散列引用的引用:foreach(key%{ReturnsHashref()}){….
。即使在5.14+中也是很好的做法。我只是偶然发现了键(%{ReturnsHashref()})
在阅读您的帖子之前,感谢您的解释和正确答案!另一种方法是从返回的列表中创建一个哈希引用,并将其作为键
函数的输入,如%{ReturnsHash()}
@Birei,是的,但如果可能的话,这是你想要避免的。我想不出返回%hash;
什么时候才有意义。(好吧,如果函数打算在标量上下文中调用的话。)即使撇开返回散列是否有意义不谈,如果您将散列展平到列表中,返回列表,然后将其复制到匿名散列中,以便再次取消引用,Perl肯定会做更多的工作。@DavidO,正如我所说,这是您希望尽可能避免的事情。:)