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 から引用するには:

複数値を持つフォーム フィールドは、フィールド名を繰り返すか、値を配列参照として渡すことによって指定できます。

そのため、「追加のカスタム パラメータ」が同じ名前の「標準パラメータ」を上書きすると予想される場合、これは起こりません。これを行うには、それらを実際のハッシュとして扱い、それらを強制的に配列参照にする必要があります。

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 に答える