p_chinのおっぱいブログ

UnityとPerlなど

HTTP::Request::Commonからperlのファットコンマなどを思い知った

POSTメソッドの引数に無名配列の中にハッシュの様な物が入ってて意味分かんなかった

#色々省略してるけどこんなん
POST($url, [
    fugu => 'kawaii',
    oppai => 85,
]);

あれ?配列の中にhash(の様な書き方)を入れると展開されるんじゃなかったっけ?

 

もちろん以下の例の様に展開される

my %hoge = (
    hoge => 'fuga',
    fugu  => 'unko',
);

my $fugu = [
    $hoge,
];

とかしちゃうと$fuguの中は
[
    hoge,
    fuga,
    fugu,
    unko,
]

この様にkeyもvalueも順番に展開される

 

上記の事をうろ覚えてたからか、何を血迷ったのかhashリファレンスを無名配列リファレンスの中に突っ込んでしまってハマった。

#hash_ref
my $hoge = {
    hoge => fuga,
    fugu  => unko,
};

#array_ref
my $fugu = [
    $hoge,
];

とかしちゃうと,@fuguの中身は
[
    {
        hoge => 'fuga',
        fugu => 'unko'
    }
]
みたいにネストされる(ハッシュリファレンスだから)

 

なんでこのPOSTメソッドは、こんな面倒くさい引数の取り方(hash形式の値がkey,value毎に要素展開された配列)をしたのか?

HTTP1.1のPOSTメソッドは一つのkeyに複数の値を指定出来るから(example.com?fugu=unko&fugu=oppaiみたいに)という理由があったらしい。

  

hashもarrayもリストをどう受け取るかでデータの入り方が変わる

  • 話が戻るが、そもそもなんで配列の中に「hoge=>fuga」と書くと展開されてしまうのか?
  • それにはファットカンマを知る必要がある

「=>」(ファットコンマ)

  • ファットコンマの前はクォートしなくてもよい
  • カンマと同じ認識なのでarrayにも使えるよ
  • 2つのデータをペアだと分かりやすくする為にkey, valueで表すhashに使用するのが主流になってる
hashにカンマで代入してみてもkey,valueで格納される
%hash = ('a', 'b', 'c', 'd' );
とかやると、%hashの中身は
(
    a => 'b',
    c => 'd',
)

逆にarrayにファットコンマだと、さっきの例の様にkey,valueもそれぞれ一要素として展開される
@array = (a => 'b', c => 'd');
の中身は
(
    'a',
    'b',
    'c',
    'd',
)
になる

あわせて読みたい

こっちの方が詳しいし書かなくて良かった感ある。