2016-08-26 1 views
1

Je suis dans une situation où je veux appeler l'un des deux sous-programmes en fonction d'un test assez simple, mais la liste des paramètres est malheureusement complexe. Cela semblerait lire plus facilement en utilisant l'opérateur ternaire et fonctionne bien en C, mais l'équivalent perl m'évite.Utilisation de l'opérateur triadique pour sélectionner un sous-programme perl

code

est quelque chose comme

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

Mais perl se fâche par la séquence )( et pour la vie de moi je ne peux pas travailler ce qu'il faut y mettre

Répondre

1

Si vous voulez utiliser la fonction les références que vous avez à les envelopper dans la syntaxe d'appel de sous-programme:

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

donc, vous devez réécrire que:

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

L'opérateur ternaire n'a pas besoin d'être contreventée soit:

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

essayer d'utiliser ceci:

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; 
} 

et bien sûr, il ne serait pas mal si vous utilisez ceci:

$param = 'world'; 

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

\func1 appelle func1 et prend une référence t o sa valeur de retour (s) - pas ce que vous voulez. Pour prendre une référence à un sous-marin, utilisez \&func1 (avec & et sans parenthèses).

Pour appeler une référence à un sous, soit vous déréférencer avec &BLOCK:

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

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

ou -> (entre parenthèses peuvent être nécessaires en raison de la haute priorité de ->):

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

Faites-le soit:

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

ou:

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