我有一種情況,我想根據一個相當簡單的測試調用兩個子例程中的一個,但參數列表非常複雜。這似乎使用三元運算符讀取最簡單,並且在C中工作正常,但perl等價物正在逃避我。使用三元操作符選擇perl子例程
代碼是一樣的東西
$res = ($d eq 'something' ? \func1 : \func2)(parameters);
但是perl的由)(
序列變得非常沮喪,對我的生活。如果你想使用的功能我不知道是什麼放在那裏
我有一種情況,我想根據一個相當簡單的測試調用兩個子例程中的一個,但參數列表非常複雜。這似乎使用三元運算符讀取最簡單,並且在C中工作正常,但perl等價物正在逃避我。使用三元操作符選擇perl子例程
代碼是一樣的東西
$res = ($d eq 'something' ? \func1 : \func2)(parameters);
但是perl的由)(
序列變得非常沮喪,對我的生活。如果你想使用的功能我不知道是什麼放在那裏
引用您必須包裝他們子程序調用語法內:
&{ something that is a code reference } ($args)
所以,你將不得不重寫爲:
$res = &{ ($d eq 'something' ? \&func1 : \&func2) } (parameters);
三元運營商並不需要待拉緊之一:
$res = &{ $d eq 'something' ? \&func1 : \&func2 } (parameters);
嘗試使用這樣的:
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);
}
\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);