這些答案是確保爲每個IP地址選擇新隨機數的好方法。但海報的主要問題是,「如何避免它們都得到相同的隨機數?」並且我不清楚他們是否意味着「爲每個IP地址獲得四個隨機數字」或「保證沒有兩個隨機選擇的IP地址是相同的。」
如果是後者:讓從rand(256)
四次調用了同樣的結果連續兩次的概率是一個在2 ,這似乎根本不值得擔心,但如果你需要保證他們不同的是,你可以保留你已經選擇的地址的哈希值,並在每次生成新地址時更新它。從@ perreal的解決方案偷:
sub rip {
my $picked_addrs = shift;
my $new_addr;
do {
$new_addr = join(".", map { int(rand(256)) } (1..4));
} while defined($picked_addrs->{$new_addr});
$picked_addrs->{$new_addr} = 1;
return $new_addr;
}
open my $f, '<', 'input' or die($!);
while (my $line = <$f>){
my %picked_addrs;
$line =~ s/$regex{'ipadress'}/rip(\%picked_addrs)/eg;
}
close($f);
如果你想確保你永遠不會選擇同一地址的文件中的任何地方兩次,只是聲明%picked_addrs
的while
外循環,所以它不會重置每行:
open my $f, '<', 'input' or die($!);
my %picked_addrs;
while (my $line = <$f>){
$line =~ s/$regex{'ipadress'}/rip(\%picked_addrs)/eg;
}
close($f);
在那裏我想*替換爲'$&'賦值*是我錯過的一些新功能。 ;-) – Qtax
@Qtax:不,我恐怕不是。有關使用'$&'*的警告依然存在。你可以使用'substr'作爲一個左值,而賦值給'$&'與分配給substr($ line,$ - [0],$ + [0] - $ - [0])是一樣的。 )'。 – Borodin