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

时间:2013-03-05 17:07:48

标签: perl hash

我知道Perl keys()函数,并希望在我拥有的哈希上使用它,但是没有看到任何设置变量的理由。让我用代码解释两种方式:

正常:

my %hash = ReturnsHash();
foreach (keys(%hash)) {
    ...code...
}

我喜欢的方式:

foreach (keys(ReturnsHash())) {
    ...code...
}

使用第二种方式我收到此错误消息(Type of arg 1 to keys must be hash or array (not subroutine entry))第二种方式是否可行?如果是这样的话?

4 个答案:

答案 0 :(得分:13)

与其名称相反,ReturnsHash不返回哈希值。 sub不可能返回哈希值。 Subs只能返回标量列表。如果你这样做

sub ReturnsHash {
   my %hash = ( a => 1, b => 2 );
   return %hash;
}
你正在做什么

return 'a', 1, 'b', 2;

既然你做不到

keys('a', 1, 'b', 2)

你做不到

keys(ReturnsHash())

现在,您可以做的是返回对哈希

的引用
sub ReturnsHashRef {
   my %hash = ( a => 1, b => 2 );
   return \%hash;
}

又名

sub ReturnsHashRef {
   return { a => 1, b => 2 };
}

在这种情况下你可以做到

keys(%{ ReturnsHashRef() })

答案 1 :(得分:3)

没有“返回哈希”的功能。如果你有

sub foo {
    ...
    return %hash;
}

my %h = foo();

然后foo不“返回哈希”;它返回%hash中键和值的列表。该列表用于创建新哈希%h。正如Joel所说,如果你将一个引用返回到一个哈希,那么keys %$href是有意义的,但你不能在没有分配的情况下在列表上运行keys它首先是哈希。

答案 2 :(得分:1)

我想你已经明白了。从您的函数中,只返回一个哈希引用,然后在foreach块中,该键将存储在$_变量中。这是一个例子:

sub ReturnsHash {

    return { key1 => 'value1', key2 => 'value2' };
}

foreach (keys(%{ReturnsHash()})) {
    print 'key:=' . $_ . "\n";
}

答案 3 :(得分:1)

为什么在您可以返回hash时返回整个hash reference

我总是会回来hash reference

sub return_hash() {
   ## Code 
   return \%hash;
}

接收

foreach (keys(%{ return_hash() })) {
 ## code
}

还有一件事,编写以small case letter开头的所有函数名称和通过_分隔的单词,总是采用良好的编码约定。