Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

引数が格納される配列@_はローカル変数です

これまでまったく意識したことなかったけれど
@_はlocalだと知ったのでメモ。

sub speak {
  my $w = &_speak_word; # ←引数なし
  print $w,"\n";
}

sub _speak_word {
  my $type = shift; # ←でも引数が取り出せる

  if ($type eq 'laugh') {
    return 'HAHAHA';
  }
  elsif ($type eq 'smile') {
    return 'NIYARI';
  }
}

speak('laugh'); #=> 'HAHAHA'

動く。
いままで_speak_wordが呼ばれた時点で、
sub speakの@_は退避されて新しく@_がsub _speak_wordで生成されるものと思っていた。
だからspeakの引数を_speak_wordに伝えるには改めて引数として明示的に差し出す必要があるかと思ってそうしてきてた。

sub speak {
  my $type = shift; # 引数を先に格納して
  my $w = _speak_word($type); # ←その引数を渡す
  print $w,"\n";
}

こんな感じに。


でも渡された引数と完全に同じ引数で何か呼ぶときは
別に何も渡さないのと同じなようだ。