2016-08-26 44 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) 

->(括號可能需要因爲->的高優先級的):

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

所以要麼:

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

或:

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