2016-10-10 2 views
5

genannt wurde, kann Sie ein Unterprogramm als eine Methode aufrufen, die beiden Syntaxen im Beispiel unter Verwendung von unten.Wie kann man überprüfen, ob ein Unterprogramm mit einem Objektaufruf Methode oder nicht

Aber man kann es auch nicht als ein Objekt aufrufen.

#==================================================== 
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"); 
#==================================================== 

Es gibt eine Möglichkeit, aus dem Innern des Unterprogramm „im Allgemeinen“ zu wissen, welche Art von Beschwörung einer Unter erhalten hat ?.

+6

Warum brauchen Sie wissen? Das klingt nach einem xy-Problem. – simbabque

Antwort

2

können Sie called_as_method von Devel::Caller verwenden.

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"; 
} 

Ausgang:

object: Opa Opa -- uno 
object: Opa Opa -- uno 
class: Opa uno -- segundo 
class: Opa Opa -- uno 
+0

Vielen Dank! –

0

Sie können auch mit der ref() Funktion tun dies anstelle der Verwendung von externen Modulen:

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; 

Ausgang:

method call 
class call 
+1

Unterprogramme können Referenzen als Argumente verwenden, so dass dies nicht zuverlässig ist, um einen Methodenaufruf zu erkennen. Aber ref() bietet mehr: Verwenden Sie es zu prüfen, ob ref ($ _ [0]) stellt die Klasse/Paketname: if (ref ($ _ [0]) eq __PACKAGE__) {...} –

+0

[Gebissen von Markdown : Das sind zwei Unterstriche, die mit 'PACKAGE' verkettet sind und mit zwei weiteren Unterstrichen verkettet sind. ] –

Verwandte Themen