First of all, make the intent of your code clear.
grep { s/\d+/a/ } @dd;
should be
@dd = map { s/\d+/a/r } @dd;
or
for (@dd) { s/\d+/a/; }
or
s/\d+/a/ for @dd;
Unlike grep and do, eval makes a copy of the values returned like a sub call.
$ perl -E'@dd = 0..9; s/\d+/a/ for @dd; say @dd;'
aaaaaaaaaa
$ perl -E'@dd = 0..9; s/\d+/a/ for grep { 1 } @dd; say @dd;'
aaaaaaaaaa
$ perl -E'@dd = 0..9; s/\d+/a/ for do { @dd }; say @dd;'
aaaaaaaaaa
$ perl -E'@dd = 0..9; s/\d+/a/ for sub :lvalue { @dd }->(); say @dd;'
aaaaaaaaaa
$ perl -E'@dd = 0..9; s/\d+/a/ for sub { @dd }->(); say @dd;'
0123456789
$ perl -E'@dd = 0..9; s/\d+/a/ for map { $_ } @dd; say @dd;'
0123456789
$ perl -E'@dd = 0..9; s/\d+/a/ for eval { @dd }; say @dd;'
0123456789
|