第25回 別のパッケージの関数を呼び出す「さらに」もう1つの方法

前回は、blessを用いた別パッケージにある関数を呼び出す方法をみた。

パッケージ名::関数名

blessされた変数->関数名

の違いを探る旅にでよう。

だが、ちょっとまった!!!!

実は、もうひとつ別パッケージを呼び出す方法があるのだ!!!!!!!

それが、これだ!!!

use strict;

package Hoge;
sub h {
  print 'Hogeの関数', "\n";
}

package main;
'Hoge'->h(); # 呼び出し!  文字列->関数名

結果:

Hogeの関数


ななんと、

文字列->関数名

の形で、関数を呼びだせてしまったではないか!!!!!!!!

なにをしたか?

'Hoge'->h();

と書いたのだ!

文字列には、Hogeと呼び出したいパッケージの名前が書かれている!!!!
なんとこんな書式で、そのパッケージの関数を呼べてしまうのである!!!

おっと失礼!

おっとっと、
実は、次のようにも書けますよ。

use strict;

package Hoge;
sub h {
  print 'Hogeの関数', "\n";
}

package main;
Hoge->h(); # 呼び出し!

結果:

Hogeの関数


つまり、

Hoge->h();

と、Hogeをシングルクォートで囲わなくても呼べます!!!!

なにが何やら!?

いったい全体なにがなんなんだ!

パッケージ名::関数名

パッケージ名->関数名

の違いは何なんだ!!!!!

ちがいは次のソースを書けば明らかとなる

use strict;

package Hoge;
sub h {
  my $z = shift;
  print "$z", "\n";  # 関数に与えられた第1引数を表示
}

package main;
Hoge::h(); # 呼び出し! :: バージョン

print '--------------', "\n";

Hoge->h(); # 呼び出し! -> バージョン

結果

結果は、次回に持ち越します。

それでは、また〜

ご自身で実行なさってみてくださいね。