Следующий код делает то же самое, что и ваш код, без лишних шагов.
while ($source =~ m/(regex)/g) { # Get all key names from source
$listkey = $1; # Grab current regex result.
$listvalue = result_of_some_function_using_list_key;
while ($listvalue) {
push @{$list{$listkey}}, $listvalue;
$listvalue = result_of_some_function_using_list_value;
}
$listkey = 0; # Reset variable.
$domain = 0; # Reset variable.
}
Однако, как прокомментировали другие, в большинстве случаев следует избегать глобальных переменных. Вместо этого ключ списка и значение списка должны быть лексически ограничены my()
, а функции для генерации значений списка должны принимать один или несколько параметров (домен, ключ списка и / или значение списка) в качестве входных данных.
Линии
$list{$listkey} = ++$i unless $list{$listkey};
$list{$listkey} = [] unless exists $list{$listkey};
в исходном коде не нужны, достаточно с push @{ $list{$key} }, $value
для инициализации записи.