2013-08-20 3 views
7

Я хотел бы, чтобы обнаружить, как подпрограмма вызывается, так что я могу заставить его вести себя по-разному в зависимости от каждого конкретного случая:Detect как подпрограмма вызывается в Perl

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

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

Возможно ли это?

ответ

15

Использование wantarray

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

Там также является HTTP://p3rl.org/Want, но для этого случая это может быть излишним. –

9

Да, то, что вы ищете, 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(); 

Этот код производит следующий вывод:

Called and assigned to an array! 
Called and assigned to a scalar! 
Called in void context! 
Смежные вопросы