Ваш сценарий сбивает с толку, но насколько я понимаю, вы хотите разбить массив путей на новые массивы, в зависимости от их пути.Ну, самый простой способ отделить их - использовать хеш, например:
use warnings;
use strict;
my %dir_arrays;
while (<DATA>) {
chomp;
if (m{^(.+/)([^/]+)$}) {
push @{$dir_arrays{$1}}, $_; # or use $2 for just filename
}
}
use Data::Dumper;
print Dumper \%dir_arrays;
__DATA__
a/a/a/test134.html
a/a/a/test223.html
a/b/b/test37.html
a/b/test41.html
a/b/test44.html
a/b/test432.html
a/d/test978.html
a/test.html
Вывод:
$VAR1 = {
'a/b/' => [
'a/b/test41.html',
'a/b/test44.html',
'a/b/test432.html'
],
'a/d/' => [
'a/d/test978.html'
],
'a/b/b/' => [
'a/b/b/test37.html'
],
'a/a/a/' => [
'a/a/a/test134.html',
'a/a/a/test223.html'
],
'a/' => [
'a/test.html'
]
};
Теперь, чтобы отправить эти массивы в функцию, сделайте что-то вроде этого:
for my $key (keys %dir_arrays) {
my_function($dir_arrays{$key}); # this sends an array reference
}
Если вы предпочитаете отправлять массив вместо ссылки на массив, просто разыменуйте его:
my_function(@{$dir_arrays{$key}});
Редактировать: Изменен скрипт для хранения полного пути,поскольку это больше соответствовало желаемому результату в вопросе.