6

您可以使用以下示例中的两种语法将子例程作为方法调用。

但是您也可以不将其作为对象调用。

#====================================================
package Opa;
sub opa{
    $first= shift;
    $second= shift;
    print "Opa $first -- $second\n";
}

package main;
# as object:
Opa->opa("uno");
opa Opa ("uno");
# not as object
Opa::opa("uno","segundo");
Opa::opa("Opa","uno");
#====================================================

有一种方法,从子程序内部,“一般”知道子程序收到了什么样的调用?

4

2 回答 2

2

您可以called_as_methodDevel::Caller使用。

use Devel::Caller qw( called_as_method );
sub opa{
    print called_as_method(0) ? 'object: ' : 'class: ';
    $first= shift;
    $second= shift;
    print "Opa $first -- $second\n";
}

输出:

object: Opa Opa -- uno
object: Opa Opa -- uno
class: Opa uno -- segundo
class: Opa Opa -- uno
于 2016-10-10T11:17:07.757 回答
0

您也可以使用该ref()功能而不是使用外部模块来执行此操作:

use warnings;
use strict;

package Test;

sub new {
    return bless {}, shift;
}
sub blah {
    if (ref $_[0]){
        print "method call\n";
    }
    else {
        print "class call\n";
    }
}

package main;

my $obj = Test->new;

$obj->blah;
Test::blah;

输出:

method call
class call
于 2016-10-10T14:22:39.353 回答