Perlの謎(その10)サブルーチンの呼び出し方

Perl初心者のためのPerlノートです!

HTML/ CSS/ CGI-Perl/ JavaScript/ JavaApplet/ AccessUp/ Internet/ EnglishLearn/ ちゃいちゃん天使/ 天使メッセージ/ 飯田ワールド/ 結城ワールド/ プロフィール/ WEB相談室/ WEBアンテナ/ WEBリーダー/ 燈明日記/ yahoo

◆ はじめに

本ページは、私がPerlを習得した時(いや習得中)のノートです。

ごく普通の言語(COBOL,C,Java,VB等)を知っている人が、Perlをやり始めるといろいろと悩むことがあります。

それは、

です。

本ページは、そのようなハードルを一つ一つクリアにしていけたらと思います。

そして、本ページが何かのお役に立てれば幸いです。では、ごゆっくりご覧ください。

尚、ご感想、ご意見、誤字、脱字、間違い等がありましたら遠慮なくPerlノート掲示板へご指摘ください。

◆ サイト最新情報

◆ コンテンツ

2009-07-20 Perlの謎(その10)サブルーチンの呼び出し方

予告したサブルーチンの呼び出し方の謎です。

しかし、予告した割りには、上手くまとまらなかったのですが・・・以下のようになりました。


◆ イントロ

まず、Perlでのサブルーチンは関数と等価です。

そして、関数の呼び出し方には、『&』のファニー文字を付けたり、付けなかったり・・・。

また、関数名の後に『()』小カッコを付けたり、付けなかったり・・・。

またまた、『&』も『()』も付けなく、ベアワードになったりと・・・。


これらは、『組み込み関数やインポートしたモジュール関数』と『ユーザ定義関数』で意味が違ってきます。

なので、各々について対比して解説をしてみました。


尚、以下は、あくまでも私のコーディング方針で、強制的なものではありません。


◆ 『&』ファニー文字について

組み込み関数やインポートしたモジュール関数は、『&』ファニー文字は付けない。

組み込み関数等に『&』を付けるとエラーになる。(ユーザ定義関数を探しに行ってエラーとなる)


ユーザが定義できる関数(サブルーチン)は、『&』を付ける方がよい

これは、ユーザ定義関数でも『&』を付けないで呼び出せますが、同名の組み込み関数等がある場合、組み込み関数が優先され、ユーザ定義関数は無視されます。なのでユーザ定義関数は『&』を付ける方がよい

いろいろな理由で『&』を付けず、ユーザ定義関数は関数名の後に『()』小カッコを付ける方がよい。


しかし、万が一、組み込み関数とユーザ定義関数が同名になった時は、『&』でユーザ定義関数を呼び出すことができる。

use strict;
use warnings;

my $hoge1 = time;   # 組み込み関数
my $hoge2 = &time;  # ユーザ定義関数

print $hoge1 , "\n";
print $hoge2 , "\n";

sub time {
    return 'hoge';
}

◆ 関数名の後の『()』小カッコについて

組み込み関数やインポートしたモジュール関数は、『()』小カッコを付けない方がよい。

カッコを付けてもOKですが、ユーザ定義関数以外であることを明示するために『()』を付けない方がよい。


ユーザが定義できる関数(サブルーチン)は、『()』小カッコを付ける。

関数をロジックの前置きに定義すると、カッコなしでもOKですが、そうしない。『()』小カッコを付けてユーザ定義関数を明示する。

use strict;
use warnings;

my $hoge1 = localtime time;    # 組み込み関数
my $hoge2 = &localtime(time);  # ユーザ定義関数

print $hoge1 , "\n";
print $hoge2 , "\n";

sub localtime {
    return $_[0];
}

◆ 引数のない関数について

引数のない場合の組み込み関数やインポートしたモジュール関数は、ベアワードにする。

引数のない場合のユーザが定義できる関数(サブルーチン)は、『&』『()』を付ける方がよい。


◆ ユーザ定義関数は、『&』をつけない?

前に、bingo_nakanishさんに『サブルーチンの頭に&は普通つけない』と教えて頂いたのですが・・・。

組み込み関数と同名のユーザ定義関数を定義したときは、どうしても『&』付きでないと呼び出せないのです。

また、現在、組み込み関数と同名がないユーザ定義関数を作って『&』無しで呼んで上手くいっていても、将来、同名の組み込み関数が出来る可能性もあるわけです。

すると、ユーザ定義関数でなく、組み込み関数が呼ばれるようになり、上位互換性がなくなり・・・。

なのでユーザ定義関数は、『&』をつけたほうがよいと思うのです。どうでしょうか?


『&』は、基本的につけません。これに関しては以下のリンク先を参照願います。

また、id:miyagawa氏から、以下のようなコメントも頂きました。

将来組み込み関数が増えた場合でも、それらの関数は use feature しないと有効にならない仕組みになっている(5.10のsay や givenなど) ので、何もなしに動かなくなる、ということはないはず。


◆ 結論

結局、前にbingo_nakanishさんに教えて頂いた通りでした(^o^)

◆ おすすめ Perl本

■ 続・初めてのPerl 改訂版

『初めてのPerl』の次ぎに読むと吉です。

結構いいですが・・・、初心者にはちょっと難しいかもです。

■ 結城浩のPerlクイズ

この本には、ちゃいちゃんパパの小話しが載っています(謎)。

ある程度、Perlを理解している人には、たまらない内容になっています。さすが結城先生だな!

結城浩のPerlクイズ

■ 新版Perl言語プログラミングレッスン入門編

実は、私はまだ読んでいませんが、結城先生の本なので良くないはずがありません。

新版Perl言語プログラミングレッスン入門編

■ CGI&Perlポケットリファレンス (Pocket reference)

この本は、非常に役に立ちます。ちょっと調べるのに最適です。サンプルも説明も的を射ています。

CGI&Perlポケットリファレンス (Pocket reference)

■ Perlベストプラクティス

一読の価値有りだと思います。

Perlベストプラクティス

■ プログラミングPerl〈VOLUME1〉

ご存知、Perl本の聖書、ラクダ本(上)です。

■ プログラミングPerl〈VOLUME2〉

ご存知、Perl本の聖書、ラクダ本(下)です。

◆ おわりに

最後に、本ページが、何かのお役に立てれば幸いです。

尚、ご感想、ご意見、誤字、脱字、間違い等がありましたら遠慮なくPerlノート掲示板へご指摘ください。

HTML/ CSS/ CGI-Perl/ JavaScript/ JavaApplet/ AccessUp/ Internet/ EnglishLearn/ ちゃいちゃん天使/ 天使メッセージ/ 飯田ワールド/ 結城ワールド/ プロフィール/ WEB相談室/ WEBアンテナ/ WEBリーダー/ 燈明日記/ yahoo

人のよいところをどんどん見つけよう