関数定義(1) 構文

やっぱり自分で関数を定義したいので、Perlでの関数定義する方法を調べてみました。
Perl ではユーザが定義した関数の事をサブルーチンとも呼ぶらしいのですが、どちらも全く同じ意味との事なので、僕は「関数」で統一したいと思います。
関数を使うと、処理を抽象化する事ができます。つまり、引数を渡して呼び出すと、なんらかの処理をしてもらう事ができます。結果として返り値が返ってくる場合もありますね。
Pascalでは返り値を返すモノをfunction(関数)、返さないモノをprocedure(手続き)と、完全に区別していましたが、Perlでは区別しないようです。
Perlで関数を定義するには sub を使います。以下、「perldoc -f sub」の引用です。

sub NAME BLOCK
sub NAME (PROTO) BLOCK
sub NAME : ATTRS BLOCK
sub NAME (PROTO) : ATTRS BLOCK
        This is subroutine definition, not a real function *per se*.
        Without a BLOCK it's just a forward declaration. Without a NAME,
        it's an anonymous function declaration, and does actually return
        a value: the CODE ref of the closure you just created.

        See perlsub and perlref for details about subroutines and
        references, and attributes and Attribute::Handlers for more
        information about attributes.

NAME が定義する関数の名前。省略すると「匿名関数」になるようです。クロージャというやつでしょうか。
BLOCK が関数の本体となるブロックですね。省略すると前方宣言(forward declaration)になるとの事。前もって関数のインターフェース(使い方)だけを定義しておいて、後からブロックを付け加える、というイメージです。
PROTO は関数のプロトタイプ。C言語などでは引数の型を指定するものでしたが、型のないPerlではどう作用するのでしょうか。コンテキストかな? 後で調べてみます。
ATTRS は……関数の属性でしょうか。ちょっとよくわかりません。これも後で調べたいと思います。
関数を呼び出すには、頭に & をつければいいみたいですが、最近の Perl ではつけなくても後ろに () を付ければ呼び出せるみたいです。
というわけで、引数なし・返り値なしの簡単な関数を定義してみます。

# sub1.pl
 
sub print_hello {
	print "Hello!\n";
}
 
&print_hello;
print_hello();
&print_hello();
print_hello;

Hello! と表示する print_hello 関数を定義してみました。また、呼び出し方を色々試してみました。
実行結果です。

Hello!
Hello!
Hello!
Hello!

全部呼び出せているみたいです。構文エラーもなし。引数がない場合はあんまり関係ないみたいですね。