,您正试图复制是书面的人谁不知道很多有关的Perl代码。它包括这一行:我认为有几个问题在这里
return $inet[int rand($#inet+1)];
一个Perl程序员会写为
return $inet[rand @inet];
- 一个与你的进出口语法和一个与你的Perl语法。
进出口是给你这个错误:
failed to expand "interface" option for dkim_remote_smtp transport: missing '}' after 'perl'
我不知道从进出口调用Perl的东西,但this page提到像${perl{foo}}
语法(这类似于你在页面中使用的一个复制)和一个像${perl{foo}{argument}}
调用子程序并传递参数。无处没有提到的语法像你这样的:
${perl{randomhosts}%:*}
我不知道,你已得到该语法,但它很可能,这是什么原因造成你的第一个错误。
在评论,你说
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"
这在我看来,进出口不支持这一要求。您需要调用该函数两次以获取您需要的两条信息。你可以在Perl中使用类似state
这样的变量来实现这一点 - 但它会比你目前在那里的代码复杂得多。其次,你的Perl代码有语法错误,所以即使Exim能够调用你的代码,它也不起作用。
你复制设置@inet
这样的代码:
@inet = ("x.x.x.1", "x.x.x.2", "x.x.x.3", "x.x.x.4");
你的等效代码是这样的:
@inet = (
"x.x.x.1:hostname1.domain.com",
"x.x.x.2:hostname2.domain.com,
x.x.x.3:hostname3.domain.com
);
我已经重新格式化它,使问题更加明显。您在数组元素周围缺少一些引号。 (注:我看到的是,虽然我一直在写这个答案,你有固定的。)
更新:好吧,这里是一些代码投入exim.pl
,你想要做什么。
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]};
}
它生成一个新的ip/host对,如果它的第一个参数是'generate'。然后它将从生成的对中返回主机名或IP地址。我想你也许可以从您的进出口config文件中这样称呼它:
但我在进出口方面的专家,所以语法可能需要调整。
在我看来,你有一个配置文件,并试图在那里输入perl命令,希望得到一些我不确定的结果。请清理问题以明确你想要的东西。如果你想使用perl来做一些事情,请发布一段可用的代码,或者至少有足够的机会猜测你想要做什么。 – bytepusher
我已编辑它。我不知道我还能解释些什么。基本上我试图旋转海关ips以及他们各自的自定义主机名在exim中,这是用perl – Motsim
构建的。请修复您的问题的格式。您的一些代码被格式化为纯文本格式。如果您希望我们查看您的代码,那么尽可能使其尽可能容易理解,这样很有礼貌。另外,你定义的'@ inet'似乎缺少一些引号字符 - 这意味着它所代表的代码甚至不会编译。如果你不够关心给我们一个你的代码的准确副本,那么我们为什么会关心足够的帮助你? –