![[tips][perl] Perlのサブルーチン呼び出しにアンパーサンドは必要か?](https://casualdevelopers.com/wp-content/uploads/2013/12/necklace-2703791_1920-700x300.jpg)
Perlでサブルーチンを呼び出す方法はいくつかあります。ググっても正確な情報がヒットしなかったので、自分でまとめておきます。
Perlのサブルーチンの呼び出し方は以下です。
1. アンパーサンドとカッコを付けて呼び出す。
# サブルーチン呼び出し my $max = &max(1, 2, 3, 4, 5); # 最大値を求めるサブルーチン sub max { my ($max) = shift @_; foreach (@_) { if ($_ > $max) { $max = $_; } } $max; }
教科書的な基本の書き方です。この書き方で正解です。
ググっていると、アンパーサンドなしが当たり前的な表現をしている人がいますが、『初めてのPerl』でも書かれている正解です(笑)
アンパーサンドを用いることで、自前のサブルーチンを明示的に呼び出していることになるので、安全にサブルーチンを呼び出せます。
サブルーチンが呼び出しの前後のどちらにあっても動作します。
2. アンパーサンドを省略して呼び出す。
これは以下の2つの条件のどちらか満たしている場合にのみ動作します。
(1)コンパイラがサブルーチンの呼び出しの前に、そのサブルーチンの定義を見ている場合→アンパーサンドがなくても、それは定義済みの関数と判断。
# 最大値を求めるサブルーチン ←呼び出し前に発見! sub max {...} # サブルーチン呼び出し my $max = max(1, 2, 3, 4, 5);
(2)サブルーチンの呼び出しの構文から、明らかにサブルーチンの呼び出しだと分かる場合→アンパーサンドがなくても、カッコがあれば関数と判断。
# サブルーチン呼び出し ←カッコがあるから関数だと判断! my $max = max(1, 2, 3, 4, 5); # 最大値を求めるサブルーチン sub max {...}
3. カッコを省略して呼び出す。
# 最大値を求めるサブルーチン sub max {...} # サブルーチン呼び出し my $max = max 1, 2, 3, 4, 5;
2に加えて、省略してもコードの意味が変わらない場合はカッコを省略できます。
この書き方は2(1)の条件上でOKです。
この場合、サブルーチンは必ず呼び出しより前になければいけません。
注意点は、2および3のようなアンパーサンドなしでサブルーチンを呼び出す場合、もしそのサブルーチン名がPerlの組み込み関数と同じ名前ならば、自前のサブルーチンは呼ぶことができず、Perlの組み込み関数が呼ばれてしまいます。
逆に言えば、Perlに確実に自前のサブルーチンを呼び出してもらうには、アンパーサンドが必要になります。


コメントを残す