2013-08-20 18 views
7

chciałbym wykryć jak podprogram nazywa więc mogę zachowywać się różnie w zależności od każdego przypadku:Detect jak podprogram nazywa Perl

# If it is equaled to a variable, do something: 
$var = my_subroutine(); 

# But if it's not, do something else: 
my_subroutine(); 

Czy to możliwe?

Odpowiedz

15

Zastosowanie wantarray

if(not defined wantarray) { 
    # void context: foo() 
} 
elsif(not wantarray) { 
    # scalar context: $x = foo() 
} 
else { 
    # list context: @x = foo() 
} 
+0

Istnieje również http://p3rl.org/ Moduł WANT, ale w tym przypadku może to być przesada. –

9

Tak, czego szukasz wantarray:

use strict; 
use warnings; 

sub foo{ 
    if(not defined wantarray){ 
    print "Called in void context!\n"; 
    } 
    elsif(wantarray){ 
    print "Called and assigned to an array!\n"; 
    } 
    else{ 
    print "Called and assigned to a scalar!\n"; 
    } 
} 

my @a = foo(); 
my $b = foo(); 
foo(); 

Ten kod daje następujący wynik:

Called and assigned to an array! 
Called and assigned to a scalar! 
Called in void context!