Perl Directory Analysis - PullRequest
       2

Perl Directory Analysis

1 голос
/ 20 ноября 2010

У меня есть глубокая структура каталогов со следующим форматом

/intf1/syst1/some1
/intf3/syst4/some111
/intf1/syst2/some2
/intf2/syst1/some1
/intf2/syst3/some9
/intf4/syst2/sdsds

Нужен вывод, в формате "

        syst1   syst2   syst3   syst4
intf1   x       x       
intf2   x               x       
intf3                           x
intf4           x

Как я могу сделать это в Perl?

ПРИМЕЧАНИЕ: intf1 ... intfn нужно отсортировать в алфавитном порядке, аналогично syst1 ... systn то же самое

Ответы [ 2 ]

2 голосов
/ 20 ноября 2010
  1. Создать хэш хеш-ссылок для хранения нужной матрицы (назовите ее %files)

  2. Создать хэш для хранения списка syst имен(назовите его %subdirs. Должно быть вместо массива has, чтобы обеспечить уникальность).

  3. Используйте glob() для получения списка файлов

  4. Используйте File::Spec->splitpath(), чтобы разбить каждый путь в списке на компоненты каталога и имя файла.

  5. Поместить значение 1 в hash-of-hashrefs %files с ключами, определяемыми какпервый и второй компоненты каталога из предыдущего шага (например, $files{$dir1}->{$dir2} = 1;.

    . Также поместите значение 1 в хэш %subdirs для подкаталога.

  6. По завершении цикла по списку файлов выведите результаты

    a. Выполните цикл по отсортированному списку ключей для хэша %subdirs. Для каждого значения выведите это значение, а затем пробел. Затем в конце выведитесимвол новой строки.

    б. Выполнить цикл по отсортированному списку ключей для %files хеш-хеш-ссылок. Для каждой клавиши $dir1:

    i. Print thЗначение ключа, за которым следует столько пробелов, сколько необходимо для выравнивания.Как это сделать, оставлено на усмотрение читателя.

    ii.Выполнить цикл по отсортированному списку ключей для %subdirs хеша.Для каждого ключа $dir2:

      - Print an X if `$files{$dir1}->{$dfir2}` is true, and print 1 space otherwise.
    
    
      - print N spaces where N is a length of the directory `$dir2`
    

    iii.Печать новой строки

0 голосов
/ 20 ноября 2010

Хотя ответ @ DVK - это путь, по которому я бы решил общую проблему такого рода, мне интересно, если ваш инструктор предназначил для вас использовать массивы и регулярные выражения для решения этой проблемы, поскольку у вас явно есть матрица.

Код лаконичен и не прокомментирован специально.

#!/usr/bin/perl

use strict; use warnings;

my @matrix;

my ($i_max, $j_max) = (0, 0);

while ( my $path = <DATA> ) {
    next unless $path =~ m{/intf([0-9])/syst([0-9])/\w+};
    my ($i, $j) = map $_ - 1, $1, $2;
    $matrix[$i][$j] = 1;
    $i_max = $i if $i > $i_max;
    $j_max = $j if $j > $j_max;
}


print_row(['' => map "syst$_", 1 .. $j_max + 1]);

for my $i ( 0 .. $i_max ) {
    print_row([
        'intf' . ($i + 1), map {
            my $v = $matrix[$i][$_];
            defined($v) ? 'x' : '';
         } 0 .. $j_max
     ]);
}

sub print_row { print join("\t", @{ $_[0] }), "\n" }

__DATA__
/intf1/syst1/some1
/intf3/syst4/some111
/intf1/syst2/some2
/intf2/syst1/some1
/intf2/syst3/some9
/intf4/syst2/sdsds
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...