sub
myをちょっとみてると、ローカル変数とかスコープの話になってくるので、とりあえずmyに行く前にsubを勉強する。
http://d.hatena.ne.jp/perlcodesample/20080607/1212814714
* func_name は、サブルーチン名で、自分で決めます。サブルーチンの機能を表現する名前が良い名前です。
* Perlでは、C言語のように、引数の型、引数の個数を指定する必要はありません。すべてのサブルーチンは、sub func_name{ } と記述します。( 引数の型や、引数の個数は、実際に実行するときに決まります。 )
* Perlでは、C言語のように、前方宣言を行う必要はありません。利用する前、利用する後ろ、どこに書いてもかまいません。
この辺読んでると、JavaScriptとの違いはfunctionがsubになっただけにみえる。
http://www.geocities.jp/ky_webid/perl5/023.html
関数を呼び出す方法は、関数名に続けて ( ) を付けてやるだけです。実は ( ) を省略できる場合もありますが( print関数の方には付いていませんね?)、これは条件付きです。「put_version」のような名前が、関数名であることが明らかであれば、( ) を省略できます。先ほど少し出てきましたが、Perl のスクリプトは上から下へ実行されます。このとき、いきなり「put_version」と言われて、それが関数名であることが既に分かっていればいいということです。上のスクリプトの場合には ( ) は省略できません。下のように書き換えると、 ( ) が省略できます。
ということは
#!/usr/bin/perl use strict; use warnings; # 自作関数の定義 sub put_version{ print "version: 1.00\n"; } print "スクリプト開始\n"; put_version; # 自作関数を呼び出す print "スクリプト終了\n";
C:\MyWorks\Perl\sub>perl sub1.pl スクリプト開始 version: 1.00 スクリプト終了
ほう。
#!/usr/bin/perl use strict; use warnings; print "スクリプト開始\n"; put_version; # 自作関数を呼び出す print "スクリプト終了\n"; # 自作関数の定義 sub put_version{ print "version: 1.00\n"; }
C:\MyWorks\Perl\sub>perl sub2.pl Bareword "put_version" not allowed while "strict subs" in use at sub2.pl line 7. Execution of sub2.pl aborted due to compilation errors.
ほほう。
この場合、上から下へ進む過程で、先に関数の定義が出てくるため、put_version を呼び出すときには、既に「put_version」が関数名であることが明らかになっています。ですから ( ) を省略できます。
なるほど。
先に関数定義されていれば()がいらないってことらしいが、つけないのになれていないので付けることにする。
ところで、他のところをいろいろみていると、決まって関数呼び出しには&を付けろと書いてある。
http://www.rfs.jp/sb/perl/02/07.html
http://www.komonet.ne.jp/~perl/chap9.htm
http://blog.livedoor.jp/dtm_world/archives/12860061.html
でも付けなくても動いてるのはなぜか。
#!/usr/bin/perl use strict; use warnings; print "スクリプト開始\n"; put_version(); # 自作関数を呼び出す print "スクリプト終了\n"; # 自作関数の定義 sub put_version{ print "version: 1.00\n"; }
&がなくても動く。
C:\MyWorks\Perl\sub>perl sub3.pl スクリプト開始 version: 1.00 スクリプト終了
なんでかなと思って調べてみたら
http://perldoc.jp/docs/perl/5.6.1/perlsub.pod
サブルーチンを呼び出すには:
NAME(LIST); # 括弧があれば & は省略可能
NAME LIST; # predeclared/imported されていれば括弧は省略可能
&NAME; # 呼び出されるサブルーチンのための @_ 作成する
と書いてある。
サブルーチンは、明示的な & というプリフィックスを付けて呼び出すことができます。最近のPerlでは & は省略可能であり、サブルーチンがあらかじめ宣言されている場合には括弧も省略できます。 defined() や undef() の引数として使ったような、単なる名前付きサブルーチンであるときの & は 省略可能ではありません。 &$subref() や &{$subref}() のような、サブルーチンの名前やリファレンスを使った間接的なサブルーン呼び出しを行いたいたいときにも & は省略することはできません。但し$subref->() の記法が問題を解決します。詳しくは perlref を参照してください。
書かなくてもいいけど書かなければならない場合があるというまとめ。
というわけで、ここでのサブルーチンはこのくらいで。