我知道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)
)第二种方式是否可行?如果是这样的话?
答案 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
开头的所有函数名称和通过_
分隔的单词,总是采用良好的编码约定。