3 votes

Création d'un hachage en Perl

Comment créer un hachage en Perl qui utilise le nom du répertoire comme clé, puis stocke à la fois le nombre de fichiers dans le répertoire et le nom de chacun des fichiers ? Est-ce possible en utilisant un hachage de hachages ou un hachage de tableaux ?

J'apprécierais tout conseil.

4voto

ikegami Points 133140

Les valeurs de hachage doivent être des scalaires, donc la vraie question est de savoir comment obtenir deux valeurs dans un scalaire. Les références sont des scalaires, donc une référence à un hash fonctionnerait.

$data{$dir} = {
   file_count => 0+@files,
   files      => \@files,
};

Notez que le nombre de fichiers est redondant. 0+@{ $data{$dir}{files} } pourrait être utilisé pour le comptage des fichiers. Si vous choisissez de vous débarrasser de cette redondance, vous pouvez utiliser

$files{$dir} = \@files;

Le nombre de fichiers est disponible en tant que

0+@{ $files{$dir} }

et les fichiers sont disponibles en tant que

@{ $files{$dir} }

(Le 0+ peut être omis dans un contexte scalaire).

2voto

Kenny Points 757

Si je comprends bien, cela semble faire l'affaire (l'impression du hachage à l'aide de Dumper() à la fin est juste pour vous montrer ce que contient le hashref) :

#!/usr/bin/perl -w

use strict;
use Data::Dumper;

my $dir = $ENV{PWD};
opendir( DIR, $dir ) or die $!;
my @files = grep { -f "$dir/$_" } readdir( DIR );
my $hash = {
    $dir => {
        count => scalar( @files ),
        files => \@files,
    }
};

print Dumper( $hash ), "\n";

2voto

Xaerxess Points 10324

Personnellement, j'utilise presque toujours des références de hachage au lieu de hachages perl (et des arrayrefs au lieu de tableaux perl, aussi). Exemple :

my $dirs = {
     '/home/user' => [ '.profile', '.bashrc', 'My_pic.png' ],
     '/root'      => [ '.profile', '.zshrc' ]
};

my $var = { (...) } fait référence au hachage, => est juste un synonyme de virgule , mais permet de faire la distinction entre les clés de hachage et les valeurs. [ (...) ] crée une référence de tableau anonyme qui est assignée comme valeur de hachage.

Vous n'avez pas besoin de stocker des informations redondantes comme le nombre de fichiers, vous pouvez simplement évaluer le tableau dans un contexte scalaire :

my $root_files = $dirs->{'/root'};
$size = scalar @{$root_files};

Vous pouvez Pour en savoir plus sur les hachages, cliquez ici et ici .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X