разбить массив на секции - PullRequest
1 голос
/ 14 июля 2011

У меня есть массив с этим типом содержимого

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

Мне нужно разделить его на «каталоги», чтобы я мог отправлять каждый массив для каталога в функцию (см. Пример кода).

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

Это то, что у меня есть до сих пор, но я чувствую, что есть много ошибок, особенно в конечных и начальных случаях, и я не настолько чист, как мне нравится.

for(my $i = 0; $i < scalar(@arrayKeys); $i++)
{
    my($filename, $directory) = fileparse($arrayKeys[$i]);
    my $currDir = $directory;

    # $currDir ne $prevDir: takes care of changes in path
    # $i + 1 == scalar(@arrayKeys): accounts for last row to be purged
    if($currDir ne $prevDir || $i + 1 == scalar(@arrayKeys))
    {   
        # if last row we need to push it
        if($i + 1 == scalar(@arrayKeys))
        {
            push(@sectionArrayKeys, $arrayKeys[$i]);
        }

        # ensure for first entry run we don't output
        if ($prevDir ne "")
        {
            &output(\@sectionArrayKeys);
        }

        # Clear Array and start new batch
        @sectionArrayKeys = ();
        push(@sectionArrayKeys, $arrayKeys[$i]);        
    }
    else
    {
        push(@sectionArrayKeys, $arrayKeys[$i]);        
    }

    $prevDir = $currDir;
}

1 Ответ

2 голосов
/ 14 июля 2011

Ваш сценарий сбивает с толку, но насколько я понимаю, вы хотите разбить массив путей на новые массивы, в зависимости от их пути.Ну, самый простой способ отделить их - использовать хеш, например:

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}});

Редактировать: Изменен скрипт для хранения полного пути,поскольку это больше соответствовало желаемому результату в вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...