第2回 main関数はどこだ? プログラムはどこから処理されるのか

C言語にはmain関数が、Javaには、クラスを用意してその中にmainメソッドがあります。
そのmain関数(メソッド)からプログラムが開始します。


さて、Perlには、main関数があるのでしょうか?
いいえ、ありません。



うわああ、ならPerlはどこから処理されるんだ???
わけわからんこの言語!!


っとなる前に次のことを覚えておけばOKです。



「ソースファイルの1行目から処理が開始する」


まあ、BEGINというのがあったりするのですが、そのあたりはアドバンテージということで、さらにPerlの学習が進んだときでいいと思います。

とりあえず、ソースファイルの1行目から実行されます。これは、JavaScriptRubyなんかもそうですね。
さて、話をPerlに戻しまして、次のソースを実行してみましょう。

use strict;

my $c = 1;  # 地べたで宣言
hoge();


sub hoge {
 print "$c", "\n";
}

結果:

1

これ、実は、1とちゃんと$cの値が取得できてしまいます。

関数の中にいないでmyをこのように地べた(この表現でよいのでしょうか?)に書くと、グローバルになってしまいます。

でも、グローバルつーのはあんまりよくないですよね。ということで次のように書くと.....

use strict;

{
my $c = 1;
}

hoge();


sub hoge {
 print "$c", "\n";
}

結果:

Global symbol "$c" requires explicit package name at c line 11.
Execution of c aborted due to compilation errors.

お! ちゃんとエラーにしてくれました。
そうなんです。 { } がその変数のスコープの範囲を示しているのです。



この書き方が気に食わないなら、自分でmain関数を用意してしまうのも手です。

use strict;

main();
hoge();

sub main{
 my $c = 1;
}

sub hoge {
 print "$c", "\n";  # hogeに$cはいないので表示できない
}

ただ、紹介しておいてなんなのですが、僕は、そのまま、

use strict;
my $c = 1;

hoge();

# なんか処理;

というように、地べたに書いていっています。


さて、これでもう知らないうちにグローバルになってもうた!!
というようなことにはならないと思いますので、楽しいプログラミングを開始してください。






ちょっとここでトリビアルな知識になるのですが、
use strict; じつは、 $a と $bに関しては、my を付けていなくても教えてくれません。

use strict;

$a = 1;  # myをつけていない
print "$a", "\n";

結果:

1

これは、配列をソートするときに、 $a, $bという変数を使う必要があるためから use stirct は $aと$bに関してはmyを付けなくても怒らないことになっています。まあ、 $a と $b はPerlに初めから組み込まれている特種な変数と考えるといいかもしれません。ですから、変数名を$cと「c」からはじめているのでした。



それでは、また次回にお会いしましょう〜