You can also declare a global hash (or array, but a hash is more convenient) containing the variables and pass it around as a parameter to the functions:
my $state= { var1 => "value1", var2 => "value2"};
sub f1
{ my( $other_param, $state)= @_;
$state->{var2}= "new_value2";
# ...
}
...
This way you group the variables together cleanly and
you can pass them to the functions without clobbering
your parameter lists.
Of course if you want to get OO brownie-points you can also make $state an full-blown object, but that would be an other story node...