my $s = 'xx @ra[1] y @ara[23] z @ra[1] aa @ara[23] b @ra[1] @ara[23]'; print qq{'$s'\n}; my %found; my %generated; $s =~ s{ \@ ([a-z] [a-z\d_]* \[) \K (\d+) (?= \]) } { $found{"$1$2"} //= do { my $rand; do {$rand = int rand 9999} while exists $generated{$rand}; $generated{$rand} = (); $rand; }; }xmsge; print qq{'$s'\n};