以下是重现问题的代码:
sub hello { return (h => 1, n => 1); }
print join ", ", values hello();
我收到错误:
arg 1到值的类型必须是哈希值 (不是子程序入口)在第4行, 靠近“);”执行 - 中止到期 编译错误。
我知道我可以打破电话和打印两行:
sub hello { return (h => 1, n => 1); }
my %hash = hello();
print join ", ", values %hash;
但我不想这样做。有没有办法在一行中执行此操作,以便我不必一直创建临时变量?
答案 0 :(得分:8)
您可以使用哈希引用:
sub hello { return {h => 1, n => 1}; }
print join ", ", values %{hello()};
但不然,没有。 Perl可以在标量或列表上下文中解释子例程的返回值,但是没有在哈希上下文中返回值的概念。
<小时/>
更新:这也有效
sub hello { return (h => 1, n => 1); }
print join ", ", values %{{hello()}};
内部{}
将hello()
的输出从列表转换为哈希引用。
外部%{}
取消引用哈希值。
(%{{}}}
是否算作pseudo-operator?)
答案 1 :(得分:8)
我没有看到真实程序中的用处,但是,有可能。
print join ", ", values %{{hello()}};
说明:hello()
是一个列表; {hello()}
是哈希引用; %{{hello()}}
是哈希值。
答案 2 :(得分:2)
您可以做的另一件事是使用切换变量。
sub hello { return (h => 1, n => 1); }
my $toggle = 1;
print join ", ", grep { $toggle = !$toggle; } hello();
您可以做的另一件事是使用List::Pairwise
use List::Pairwise qw<mapp>;
print join ", ", mapp { $b } hello();
我一直在寻找一些东西来处理“流”中的名称 - 值对列表,甚至自己滚动,但后来我在CPAN上找到了这个。
答案 3 :(得分:-1)
我不相信这是可能的,因为Perl的输入类型不够强,无法知道子程序返回的内容。
就Perl而言,所有子程序只返回LIST(或单个SCALAR)。 LIST可以对它们应用某些操作(索引,切片等),但不需要ARRAY变量(如push
,pop
,shift
)或HASH变量(包括keys
,values
,delete
,exists
)。
散列赋值将LIST作为参数(函数返回),并创建一个关联散列,每个奇数元素用作下一个偶数元素的键。只有在这个赋值之后它才能在Perl的语法中被称为HASH,因此只有它才能在values
函数中使用。