第26回 別パッケージの関数を呼び出すいろいろな方法 まとめ

さあ、
別パッケージを呼び出す方法が、たくさん出てきたので、混乱してきたところではないだろうか?
いままでのところをまとめよう。

別パッケージの関数を呼び出す方法

  • パッケージ名::関数名
  • blessされた変数->関数名
  • 'パッケージ名'->関数名
  • パッケージ名->関数名

この 4つの方法がでてきたわけだが、
下3つに共通しているのは、 -> 記号で関数を呼んでることである。

つまり


前回の最後のソースを実行してみよう

それでは、前回の最後のソースを実行してみよう!
先ほども述べたが、別パッケージを呼び出す方法は、

で呼び出す方法
  • > で呼び出す方法

に大別できるのである。 この違いを示すのが、前回のソースである。


(再掲)

use strict;

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

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

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

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

結果:

--------------
Hoge

??? さて? この結果が意味するところはなんなのであろうか?

結果から言えること

で呼んだ方には、何も表示されていない。
  • > で呼んだ方は、Hogeと表示された。

h()関数がしていることは、第1引数の表示である。


そう。

で呼んだ方は、第1引数を表示できていない、
  • > で呼んだ方は、第1引数を表示できた のである。

実は

実は、こんなことが起こっているのである。

  • > は、なんと! 見えないところで第1引数が増えているのである!!!!!

ちなみに、

'Hoge'->h();

Hoge->h();

は同じであるので、 h()関数に、'Hoge'が渡ったことになり、それが表示されたのだ!
第1引数に、 -> の左の部分が渡るか、渡らないか! これが大きな違いである!!!

->記号を混乱するな!

しかしだ!!!
今回の->記号は、デリファレンスの記号でもなんでもない!!!!
ただ、「パッケージの関数呼び出しの機能 と 第1引数に ->の左の部分を与える」 というこの意味しかもっていないのである。

blessされたやつはどうなったか

blessされたもので -> 記号で関数呼び出しするのも、まったく同じで、第1引数に、blessされた変数が渡っているのである。


その話は、また次回
それでは また〜