在函数调用的同一行获取哈希键/值

时间:2010-07-30 19:48:49

标签: perl

以下是重现问题的代码:

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;

但我不想这样做。有没有办法在一行中执行此操作,以便我不必一直创建临时变量?

4 个答案:

答案 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变量(如pushpopshift)或HASH变量(包括keysvaluesdeleteexists)。

散列赋值将LIST作为参数(函数返回),并创建一个关联散列,每个奇数元素用作下一个偶数元素的键。只有在这个赋值之后它才能在Perl的语法中被称为HASH,因此只有它才能在values函数中使用。