すみませんが教えてください。

下記のコードの3行目と5行目が何をしているのかわかりません。

特に3行目の@{ $form_data{$name} }っていう書き方を見たことがないので
どういう配列を作っているのかがわかりません。

なぜrefで判定する必要があるのかもわからないので
詳しい方教えて下さい。


if(exists $form_data{$name} ) {
if(ref $form_data{$name} ) {
push @{ $form_data{$name} } , $value;
  } else {
$form_data{$name} = [$form_data{$name} } , $value ];
  }
else {
$form_data{$name} = $value;
}