C:\>perl -e "$x=4; $a=1; $f[$x]=exp(-$a*$x**2); print $f[$x]" 1.12535174719259e-007 C:\>
C:\>perl -le "$a=1; for(1..10){ $x=$_; $f[$x]=exp(-$a*$x**2); print $f[$x]}" 0.367879441171442 0.0183156388887342 0.00012340980408668 1.12535174719259e-007 1.3887943864964e-011 2.31952283024357e-016 5.24288566336346e-022 1.60381089054864e-028 6.63967719958073e-036 3.72007597602084e-044 C:\>
C:\>perl -le "$a=1; $f[$x]=$x**2; for(1..10){ $x=$_; $g[$x]=exp(-$a*$x**2); print \"$x\t$f[$x]\t$g[$x]\";}" 1 0.367879441171442 2 0.0183156388887342 3 0.00012340980408668 4 1.12535174719259e-007 5 1.3887943864964e-011 6 2.31952283024357e-016 7 5.24288566336346e-022 8 1.60381089054864e-028 9 6.63967719958073e-036 10 3.72007597602084e-044 C:\>
うまくできたと思ったけど、こうするとだめなんだな。つまり上の場合、$f[$x]には何も含まれてはいないから表示もされないわけなんだな。これは$f[$x]を定義した式の右辺に$xが含まれていて、$xがこの時点で定義されていないためなんだな。そこで下のようにしてみるんだな。
C:\>perl -le "$a=1; sub f(){return exp(-$a*$_**2);} for(1..10){ print &f($x)}" 0.367879441171442 0.0183156388887342 0.00012340980408668 1.12535174719259e-007 1.3887943864964e-011 2.31952283024357e-016 5.24288566336346e-022 1.60381089054864e-028 6.63967719958073e-036 3.72007597602084e-044 C:\>
こうするとprint文が実行されたときにサブルーチン&fが引数$x付きで呼ばれて、目的の関数を毎回定義しなくてもよくなるんだな。また、こうすることで余分なメモリを使わなくてすむこともあるんだな。つまり、どうせ1回表示するだけならサブルーチンとして定義しておいたほうがいいということ。