3

我知道 Perlkeys()函数,并想在我拥有的哈希上使用它,但看不出有任何理由为其设置变量。让我在代码中解释两种方式:

普通的:

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

4 回答 4

15

与其名称相反,它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() })
于 2013-03-05T17:22:19.893 回答
3

没有“返回哈希”的函数之类的东西。如果你有

sub foo {
    ...
    return %hash;
}

my %h = foo();

然后 foo 不会“返回哈希”;它返回中的键和值的列表%hash。该列表用于创建新的 hash %h。正如 Joel 所说,如果您返回对哈希的引用keys %$href,那么这是有道理的,但是如果不keys先将列表分配给哈希,您就无法在列表上运行。

于 2013-03-05T17:19:39.780 回答
1

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

sub ReturnsHash {

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

foreach (keys(%{ReturnsHash()})) {
    print 'key:=' . $_ . "\n";
}
于 2013-03-05T17:12:05.370 回答
1

既然可以退货,为什么要整件大件hash退货hash reference

我总是会去退货hash reference

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

并将其接收为

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

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

于 2013-03-05T17:25:45.070 回答