Le code que vous essayez de copier a été écrit par quelqu'un qui ne sait pas grand-chose à propos de Perl. Il comprend cette ligne:
return $inet[int rand($#inet+1)];
Un programmeur Perl écrirait cela comme
return $inet[rand @inet];
Je pense qu'il ya quelques problèmes ici - avec une syntaxe et une avec Exim votre syntaxe Perl.
Exim vous donne cette erreur:
failed to expand "interface" option for dkim_remote_smtp transport: missing '}' after 'perl'
Je ne sais rien à appeler Perl de Exim, mais this page mentionne une syntaxe comme ${perl{foo}}
(qui est similaire à celui utilisé dans la page que vous êtes copier à partir de) et un comme ${perl{foo}{argument}}
pour appeler un sous-programme et lui passer un argument.Nulle part ne mentionne la syntaxe comme la vôtre:
${perl{randomhosts}%:*}
Je ne sais pas où vous avez cette syntaxe de, mais il semble probable que ce soit la cause de votre première erreur.
Dans un commentaire, vous dites
I am stying to get first part of string before colon for each random array value for "interface" and part after colon for "helo_data"
Il me semble que Exim ne supporte pas cette exigence. Vous devrez appeler la fonction deux fois pour obtenir les deux informations dont vous avez besoin. Vous pourriez être en mesure de le faire dans le Perl en utilisant quelque chose comme state
variables - mais ce serait beaucoup plus complexe que le code que vous avez actuellement là. Deuxièmement, votre code Perl a une erreur de syntaxe, donc même si Exim était capable d'appeler votre code, cela ne fonctionnerait pas.
Le code que vous copiez des jeux en @inet
comme ceci:
@inet = ("x.x.x.1", "x.x.x.2", "x.x.x.3", "x.x.x.4");
Votre code équivalent est la suivante:
@inet = (
"x.x.x.1:hostname1.domain.com",
"x.x.x.2:hostname2.domain.com,
x.x.x.3:hostname3.domain.com
);
J'ai reformaté ce, pour rendre les problèmes plus évidents. Il vous manque un certain nombre de guillemets autour des éléments du tableau. (Note: Je vois que pendant que j'ai écrit cette réponse, vous avez fixe.)
Mise à jour: Ok, voici un code à mettre en exim.pl
qui fait ce que vous voulez.
use feature qw[state];
sub randomhosts {
state $current;
my @inet = (
"x.x.x.1:hostname1.domain.com",
"x.x.x.2:hostname2.domain.com",
"x.x.x.3:hostname3.domain.com"
);
if ($_[0] eq 'generate') {
shift;
@{$current}{qw[ip host]} = split /:/, $inet[rand @inet];
}
return $current->{$_[0]};
}
Il génère une nouvelle paire ip/hôte si son premier argument est 'generate'. Il retournera ensuite le nom d'hôte ou l'adresse IP de la paire générée. Je pense que vous pouvez probablement l'appeler à partir de votre fichier de configuration Exim comme ceci:
Mais je ne suis pas expert en Exim, de sorte que la syntaxe pourrait avoir besoin de peaufinage.
Il me semble que vous avez un fichier de configuration et que vous essayez simplement de taper des commandes perl dans l'espoir d'obtenir un résultat dont je ne suis pas sûr. Veuillez nettoyer la question pour clarifier ce que vous voulez réellement. Si vous voulez utiliser perl pour faire quelque chose, veuillez poster un code utilisable ou au moins assez pour avoir une chance de deviner ce que vous essayez de faire. – bytepusher
Je l'ai édité. Je ne sais pas ce que je peux expliquer de plus. Fondamentalement, je suis en train de faire pivoter ips douane avec leurs noms d'hôtes personnalisés respectifs dans exim qui est construit avec perl – Motsim
S'il vous plaît corriger le formatage de votre question. Une partie de votre code est en cours de formatage en texte brut. Si vous voulez que nous regardions votre code, il est poli de le rendre aussi facile à comprendre que possible. En outre, votre définition de '@ inet' semble manquer de quelques guillemets - ce qui signifie que le code tel qu'il est ne compile même pas. Si vous ne vous souciez pas assez de nous donner une copie exacte de votre code, alors pourquoi voudrions-nous vous aider? –