4.8 可変長のパラメータリスト

実世界のPerlコードでは、任意の長さのパラメータリストをサブルーチンに渡すということがよくあります。

ってことは、引数の数を限定しないサブルーチンを
作ることができる。
そしてそれがよくある、ということですね。
そういう関数を他の言語で書いた経験はないのですが、
よく考えるとそれは私の書いてきたプログラムのジャンルが
偏っていたから、ということに尽きるような気がします。
だってこうしなきゃ実現できない処理、
または実現が面倒になる処理って
たくさんありそうだから。


それはさておき、以下の引数の大きい方の値を求める関数max*1
引数を何個でも受け取れるように改良した例文が載っていたので
動くように変更して練習。
(予定外の値を入力された場合の処理なし)

  • 引数2個の場合。

#!/usr/bin/perl -w
use strict;

print "2行にわけて数字を2つ入力して下さい。:\n";
int &max();

sub max {
  my($a, $b) = @_;
  if($a > $b) { $a } else { $b }
}


  • 引数を何個でも受け取れる場合。

#!/usr/bin/perl -w
use strict;

print "改行して数字を複数入力して下さい。:\n";

print &max();

sub max {
  my($max_so_far) = shift @_;
  foreach (@_) {
    if ($_ > $max_so_far) {
      $max_so_far = $_;
    }
  }
  $max_so_far;
}

後者は最高水位線というそう。
Perlではこう書けるんだな、という好例。


また、空のパラメータリストが与えられた場合についても
4.8.2で説明してあります。
そういうことよくありそうですもんね。
上記の&maxの場合は、戻り値がundefになる、と。

*1:等しい場合の処理が中途半端だけど、原文そのままで。