我了解 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)
)第二种方式可能吗?如果是的话怎么办?
与它的名字相反,
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 之前它会产生(安全忽略)实验警告。
不存在“返回哈希值”的函数。如果你有
sub foo {
...
return %hash;
}
my %h = foo();
那么 foo 不会“返回哈希值”;它返回 %hash
中键和值的
list。该列表用于创建新的哈希
%h
。正如 Joel 所说,如果您将 reference 返回到哈希,那么 keys %$href
是有意义的,但是如果不先将其分配给哈希,则无法在列表上运行 keys
。
我想你已经明白了。 从您的函数中,只需返回一个哈希引用,然后在您的
foreach
块内,密钥将存储在 $_
变量中。 这是一个例子:
sub ReturnsHash {
return { key1 => 'value1', key2 => 'value2' };
}
foreach (keys(%{ReturnsHash()})) {
print 'key:=' . $_ . "\n";
}
既然可以退货
hash
,为什么要退回整个笨重的hash reference
!
我总是会选择退货
hash reference
。
sub return_hash() {
## Code
return \%hash;
}
并将其接收为
foreach (keys(%{ return_hash() })) {
## code
}
还有一件事,编写以
small case letter
开头的所有函数名称和通过 _
分隔的单词始终被视为良好的编码约定。