2010-11-20 4 views
1

J'ai une structure profonde Directory avec le format suivantRépertoire Perl Analyse

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

Besoin de la sortie, au format »

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

Comment puis-je faire en Perl?

NOTE: intf1 ... intfn doivent être triés de manière alphanumérique, de même syst1 ... systn le même

Répondre

2
  1. Créer hachage de hashrefs pour stocker la matrice que vous voulez (appeler %files)

  2. Créer un hachage pour stocker la liste des noms syst (appeler %subdirs. Devrait être un a au lieu de tableau pour assurer l'unicité).

  3. Utilisez glob() pour obtenir une liste des fichiers

  4. Utilisez File::Spec->splitpath() pour diviser chaque chemin dans la liste en composants de répertoire et nom de fichier.

  5. Put valeur 1 dans le hachage de-hashrefs %files avec des touches déterminées par des premier et second composants de répertoire provenant de l'étape précédente (par exemple $files{$dir1}->{$dir2} = 1;.

    En outre, la valeur mettre de 1 dans la table de hachage %subdirs pour un sous-répertoire.

  6. Lorsque vous avez terminé en boucle sur la liste des fichiers, imprimer les résultats

    a. exécuter une boucle sur la liste triée des clés pour %subdirs hachage. pour chaque Valu e, imprime cette valeur suivie d'un espace. Puis, à la fin, imprimez le saut de ligne.

    b. Exécutez une boucle sur la liste triée des clés pour %files hash-of-hashrefs. Pour chaque touche $dir1:

    i. Imprimez la valeur de la clé, suivie par autant d'espaces que nécessaire pour garantir l'alignement. Comment faire cela est laissé comme excercise pour le lecteur.

    ii. Exécutez une boucle sur la liste triée des clés pour le hachage %subdirs. Pour chaque touche $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. Imprimer newline

0

Bien que @ la réponse de DVK est la façon dont je pencherais pour un problème général de ce genre, je me demande si votre instructeur signifiait pour vous utiliser des tableaux et des expressions régulières pour résoudre ce que vous avez clairement une matrice .

Le code est concis et sans commentaire exprès.

#!/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 
Questions connexes