in reply to passing an array ref to subroutine and modifying its elements

If you want to modify $x and $mod, your final calling convention will not work. The array reference creation syntax there actually copies the values from $x and $mod, it doesn't create references to them:
sub change { my $arr = shift; $_++ for @$arr; } my $x = 1; my $y = 2; change([ $x, $y ]); print "($x) ($y)\n";

If you want to modify the values themselves, you'll have to do something like:

sub change { my $arr = shift; $$_++ for @$arr; } my $x = 1; my $y = 2; change([ \$x, \$y ]); print "($x) ($y)\n";
which is exactly what you have. Or you could say change([ \( $x, $y ) ]);, which is my preference.