У меня есть модуль с набором функций, реализованных в виде хеш-функции диспетчеризации с вспомогательной функцией, таким образом:
my $functions = {
'f1' => sub {
my %args = @_;
## process data ...
return $answer;
},
[etc.]
};
sub do_function {
my $fn = shift;
return $functions->{$fn}(@_);
}
Это используется некоторыми сценариями, которые обрабатывают данные, разделенные табуляцией;проверяемый столбец конвертируется соответствующей подпрограммой.При обработке значения в столбце я передаю хэш данных подпрограмме, и он генерирует скаляр, новое значение для столбца.
В настоящее время подпрограммы называются следующим образом:
my $new_value = do_function( 'f1', data => $data, errs => $errs );
и все переменные в аргументах объявлены как 'my' - мои $ data, мои $ errs и т. Д. Возможно ли обновить другие значения в аргументах, передаваемых в подпрограммы, без необходимости их возврата?т.е. вместо того, чтобы делать это:
... in $functions->{f1}:
my %args = @_;
## process data ...
## alter $args{errs}
$args{errs}->{type_one_error}++;
## ...
return { answer => $answer, errs => $args{errs} };
...
## call the function, get the response, update the errs
my $return_data = do_function( 'f1', data => $data, errs => $errs );
my $new_value = $return_data->{answer};
$errs = $return_data->{errs}; ## this has been altered by sub 'f1'
Я мог бы сделать это:
my $new_value = do_function( 'f1', data => $data, errs => $errs );
## no need to update $errs, it has been magically updated already!