Perl - 如何将[a => 1,b => 2,...]等2个数组/列表连接到一个?

时间:2013-03-29 10:09:09

标签: arrays perl http-post httprequest

我需要加入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的帮助, 罗伯特

澄清:

这是aprox。我想做什么:

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;
}

嗯......我没有得到合适的语法。请你帮助我一次!? ;)

2 个答案:

答案 0 :(得分: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响应的错误。)

答案 1 :(得分: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使用数组而不是常规哈希/ hashrefs的原因是它需要能够用不同的“值”定义相同的“键”。引用模块的perldoc:

  

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

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

my %standards = ( foo => 'bar', bar => 'foo');
my %additionals = ( foo => 'not-bar', this => 'that');
$ua->request(POST 'http://somewhere/foo', [ %standards, %additionals ]);