$predecessor_matrix
- скаляр, а %predecessor_matrix
- хеш. Различные типы в Perl (скаляр, массив, хэш, функция и дескриптор файла) имеют разные записи в таблице символов и, следовательно, могут иметь одинаковые имена.
Кроме того, у вас есть проблема в вашей функции. Ожидается, что он сможет получить два хэша от @_, но хеш в контексте списка (например, в списке аргументов функции) дает список пар ключ-значение. Таким образом, %predecessor_matrix
и %shortestpath_matrix
попадут в %predecessor_matrix
функции. Вам нужно использовать ссылки :
package Routines;
use strict;
use Exporter;
sub load_shortest_path_matrices {
my $predecessor_matrix = shift;
my $shortestpath_matrix = shift;
$predecessor_matrix->{key} = "value";
...
}
и
use Routines;
use strict;
my %predecessor_matrix;
my %shortestpath_matrix;
Routines::load_shortest_path_matrices(
\%predecessor_matrix,
\%shortestpath_matrix
);
Однако передача структур для загрузки в качестве аргументов более C-подобна Perl-подобной. Perl может возвращать более одного значения, поэтому более распространенный код выглядит так:
package Routines;
use strict;
use Exporter;
sub load_shortest_path_matrices {
my %predecessor_matrix;
my %shortestpath_matrix;
...
return \%predecessor_matrix, \%shortestpath_matrix;
}
и
use Routines;
use strict;
my ($predecessor_matrix, $shortestpath_matrix) =
Routines::load_shortest_path_matrices();
for my $key (keys %$predecessor_matrix) {
print "$key => $predecessor_matrix->{$key}\n";
}