2016-08-26 2 views
1

У меня есть ситуация, когда я хочу вызвать одну из двух подпрограмм в зависимости от довольно простого теста, но список параметров, к сожалению, сложный. Казалось бы, это проще всего читать с помощью тернарного оператора и отлично работает на C, но эквивалент perl уклоняется от меня.Использование триадного оператора для выбора подпрограммы perl

код что-то вроде

$res = ($d eq 'something' ? \func1 : \func2)(parameters); 

Но Perl становится очень расстроен )( последовательности и для жизни меня я не могу работать, что поставить там

ответ

1

Если вы хотите использовать функцию ссылки вы должны обернуть их в подпрограмму вызова синтаксисом:

&{ something that is a code reference } ($args) 

Таким образом, вы должны переписать, что, как:

$res = &{ ($d eq 'something' ? \&func1 : \&func2) } (parameters); 

Тройная оператор не должен быть фиксированы либо:

$res = &{ $d eq 'something' ? \&func1 : \&func2 } (parameters); 
0

попробовать использовать это:

use strict; 
use warnings; 

my $d = 'something'; 
my $res = &{($d eq 'something' ? \&func1 : \&func2)}('world'); 

print $res; 

sub func1 { 
    my $resp = shift; 
    return 'hello'.$resp; 
} 

sub func2 { 
    my $resp = shift; 
    return 'world'. $resp; 
} 

и, конечно, это не повредит, если вы используете это:

$param = 'world'; 

if ($d eq 'something') { 
    print func1($param); 
} 
else { 
    print func2($param); 
} 
6

\func1 вызывает func1 и принимает ссылку t o его возвращаемое значение (ы) - не то, что вы хотите. Чтобы получить ссылку на югу, используйте \&func1& и без круглых скобок).

Для вызова ссылки на подлодки, вы либо разыменования его с &BLOCK:

&{ statements-yielding-a-coderef }(parameters) 

# can be simplified to this if the reference is in a simple scalar: 
&$coderef(parameters) 

или с -> (круглые скобки может потребоваться из-за высокого приоритета -> «s):

(expression-yielding-a-coderef)->(parameters) 

Так же:

$result = &{ $d eq 'something' ? \&func1 : \&func2 }(parameters); 

или:

$result = ($d eq 'something' ? \&func1 : \&func2)->(parameters); 
Смежные вопросы