Perlでの「::」と「->」の違い
「::」は、モジュールのサブルーチンをコールするときに使います。
「->」は、モジュールのメソッドを起動するときに使います。(他にデリファレンスの時も使う)
違いは、メソッドでは、必ず、第一引数が自オブジェクトになるとこです。
つまり、メソッドでは、引数なしの時でも、自動的に第一引数が自オブジェクトになるのです。
テストソースtestx.pl
#!/usr/bin/perl use strict; use DateString; my $date = DateString->new(); print DateString::to_string($date), "\n"; # サブルーチンコール(Sun Feb 3 12:08:37 2008が表示される) print $date->to_string, "\n"; # メソッド起動(Sun Feb 3 12:08:37 2008が表示される) print "\n-- オブジェクトのメソ\ッド起動 --\n"; print $date->test, "\n"; print $date->test(), "\n"; print $date->test("AAA"), "\n"; print "\n-- モジュールのサブルーチンコール --\n"; print DateString::test, "\n"; print DateString::test(), "\n"; print DateString::test($date), "\n"; print DateString::test("AAA"), "\n"; print "\n-- クラスのメソ\ッド起動 --\n"; print DateString->test, "\n"; print DateString->test(), "\n"; print DateString->test("AAA"), "\n";
DateString.pmモジュールソース
package DateString; use strict; sub test { print "$_[0]---test---$_[1]"; return (); } sub new { my $class = shift; my $time = shift || time(); return bless { time => $time }, $class; } sub to_string { my $self = shift; return scalar localtime $self->{time}; } 1; __END__
処理結果
C:\Documents and Settings\xxx>perl testx.pl Sun Feb 3 12:37:01 2008 Sun Feb 3 12:37:01 2008 -- オブジェクトのメソッド起動 -- DateString=HASH(0x1625e50)---test--- DateString=HASH(0x1625e50)---test--- DateString=HASH(0x1625e50)---test---AAA -- モジュールのサブルーチンコール -- ---test--- ---test--- DateString=HASH(0x1625e50)---test--- AAA---test--- -- クラスのメソッド起動 -- DateString---test--- DateString---test--- DateString---test---AAA
ちなみに、bless関数は、第一引数のリファレンスを第二引数のクラス名と関連付け、そのリファレンスをオブジェクトとして返します。