2

我需要加入 2 个 perl 数组/列表(对不起,不知道它们是如何正确命名的)格式

[ a=>1, b=>2, c=>3 ] and [ d=>4, e=>5, f=6 ]

并且需要加入他们

[ a=>1, b=>2, c=>3, d=>4, e=>5, f=6 ]

我怎样才能做到这一点?我以前从未使用过这样的列表...

我需要它用于 HTTP::Request::Common

$ua->request(POST 'http://somewhere/foo', [foo => bar, bar => foo]);

因为我为每个请求都有一组标准参数,另外还有根据请求的自定义参数。当然,我不想在每个请求中都编写相同的代码,而是只定义一次公共参数。

Tnx 为您提供帮助,罗伯特

澄清:

这是大约。我想做的事:

my $result = httpPOST( $url, [ a=>1, b=2, ... ] );

sub httpPOST {
    my( $url, $params ) = @_; # ???
    my $ua = LWP::UserAgent->new;

    my $result  = $ua->request( POST $url, [ %auth, ????? ] );

    return $result->content;
}

嗯...我没有得到适当的语法。请你再帮我一次好吗!?;)

4

2 回答 2

6
[ ... ]

类似于

do { my @anon = ( ... ); \@anon }

您有一个哈希 ( %auth) 和一个对数组 ( $params) 的引用。


%hash获取散列的元素作为键和值的列表。

@array获取数组的元素,这意味着@$ref获取引用数组的元素。

所有你需要的是

 [ %auth, @$params ]

请注意,您永远不应该使用->content. 改为使用->decoded_content。因此,您应该使用以下代码:

my $response  = $ua->request( POST $url, [ %auth, @$params ] );
return $response->decoded_content( charset => 'none' );

charset => 'none'解决了破坏 XML 响应的错误。)

于 2013-03-29T10:13:27.823 回答
1

在 Perl 中,=>被称为“胖逗号”,与普通的基本相同,,只是“不需要在它的左边引用单词”。所以基本上

[ a=>1, b=>2, c=>3 ] and [ d=>4, e=>5, f=>6 ]

等同于

[ 'a', 1, 'b', 2, 'c', 3 ] and [ 'd', 4, 'e' 5, 'f', 6 ]

如果您想知道奇怪的语法做了什么。在 Perl 中,一个常见的模因是使用类似的东西function(key => 'value')来代替作者function('key', 'value')是否“看起来更自然”。Perl 本身并不介意这两种方式。

您可以正常合并这些 ( [ @$list1, @$list2 ]),但在这种情况下,它可能不是您想要的。你看,HTTP::Request::Common使用数组而不是常规哈希/哈希引用的原因是它需要能够定义具有不同“值”的相同“键”。引用模块的 perldoc:

可以通过重复字段名称或将值作为数组引用传递来指定多值表单字段。

因此,如果您希望您的“附加自定义参数”覆盖任何同名的“标准参数”,则不会发生这种情况。为此,您应该将它们视为实际的哈希值,然后强制它们排列 refs:

my %standards = ( foo => 'bar', bar => 'foo');
my %additionals = ( foo => 'not-bar', this => 'that');
$ua->request(POST 'http://somewhere/foo', [ %standards, %additionals ]);
于 2013-03-29T19:53:13.427 回答