,您正試圖複製是書面的人誰不知道很多有關的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'似乎缺少一些引號字符 - 這意味着它所代表的代碼甚至不會編譯。如果你不夠關心給我們一個你的代碼的準確副本,那麼我們爲什麼會關心足夠的幫助你? –