2016-08-26 1 views
1

かなり単純なテストによって2つのサブルーチンのうちの1つを呼び出したい状況がありますが、パラメータリストは悲しいほど複雑です。これは、三項演算子を使って最も読みやすく、C言語でうまく動作するようですが、perlの同等物が私を回避しています。3者演算子を使用して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); 
関連する問題