Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从函数返回值中使用Perl keys()?_Perl_Hash - Fatal编程技术网

如何从函数返回值中使用Perl keys()?

如何从函数返回值中使用Perl keys()?,perl,hash,Perl,Hash,我知道Perlkeys()函数,并希望在我已有的散列中使用它,但我不认为有任何理由为它设置变量。让我用两种方式解释代码: 正常: my %hash = ReturnsHash(); foreach (keys(%hash)) { ...code... } 我想要的方式是: foreach (keys(ReturnsHash())) { ...code... } 使用第二种方法,我得到这个错误消息(键的arg1类型必须是散列或数组(不是子例程条目)),第二种方法可能吗?如果是,

我知道Perl
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,正如我所说,这是您希望尽可能避免的事情。:)