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

问题描述 投票:0回答:4

我了解 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)
)第二种方式可能吗?如果是的话怎么办?

perl hash
4个回答
16
投票

与它的名字相反,

ReturnsHash
不返回哈希值。子程序不可能返回哈希值。 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() })

替代方案

你可以做

for my ( $k, $v ) ( a => 1, b => 2 ) {
   ...
}

所以你可以做

for my ( $k, $v ) ( ReturnsHash() ) {
   ...
}

这需要 Perl 5.36+,尽管在 Perl 5.40 之前它会产生(安全忽略)实验警告。


3
投票

不存在“返回哈希值”的函数。如果你有

sub foo {
    ...
    return %hash;
}

my %h = foo();

那么 foo 不会“返回哈希值”;它返回 %hash 中键和值的

list
。该列表用于创建新的哈希
%h
。正如 Joel 所说,如果您将 reference 返回到哈希,那么
keys %$href
是有意义的,但是如果不先将其分配给哈希,则无法在列表上运行
keys


1
投票

我想你已经明白了。 从您的函数中,只需返回一个哈希引用,然后在您的

foreach
块内,密钥将存储在
$_
变量中。 这是一个例子:

sub ReturnsHash {

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

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

1
投票

既然可以退货

hash
,为什么要退回整个笨重的
hash reference

我总是会选择退货

hash reference

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

并将其接收为

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

还有一件事,编写以

small case letter
开头的所有函数名称和通过
_
分隔的单词始终被视为良好的编码约定。

© www.soinside.com 2019 - 2024. All rights reserved.