perlわかんない

以下の場合にエラーになるのなんででしょうか

#!/usr/bin/env perl
use strict;
use warnings;

my $a = [1];   # $a は arrayref
$a->[0] = 999; # ok.

sub hoge {
    return \@_;
}

my $b = hoge(1); # $b も arrayref
$b->[0] = 999; # Modification of a read-only value attempted <- なぜ?

$aも$bもarrayrefです。
$aは代入可能ですが、$bは「定数を変更するな」といわれて代入不可能になります。
どういうことか、と思って調べていたら、以下のようなエントリを発見


perlでは関数引数は基本的に参照渡し」


な、なんだってー
参照渡しということは

sub fuga {
    $_[0] = 999;
}

fuga(1); # Modification of a read-only value attempted

なるほどエラーになりました
参照渡しであるならば上のは納得です

1 = 999;

がエラーになるのと同じと考えられます。
じゃ、関数内部の@_は何者なのだろう?普通の配列のように扱えているけど、
配列とは別物ということなのでしょうか(少なくとも挙動は違う)


ちゃんとperlsubを読んでみよう。。。