2012-02-27 5 views
0

Je suis assez nouveau à Perl, et j'écris un script Perl. Une partie de mon script compte le nombre de fois que chaque mot apparaît dans le fichier texte. CE COMPTAGE RÉPÉTE APRÈS DES INTERVALLES SPÉCIFIQUES, DONC J'AI BESOIN D'UN RÉSEAU POUR CHACUNE DE CETTE SÉQUENCE RÉPÉTÉE. J'ai le code pour compter le nombre de mots, MAIS POUR SEULEMENT SEQUENCE. Mon problème est que j'ai besoin de créer un tableau pour les "comptes" de hachage.Initialiser un tableau de hachage en Perl

EDIT: Par ARRAY Je veux dire que je devrais être capable de stocker la répétition pour chaque mot pour chaque section particulière du fichier texte. J'ai juste besoin de déterminer le compte partiel pour chaque section dans le fichier texte. Voici à quoi ressemble mon fichier texte:

i HAVE uploaded an image to describe in details

+0

"Y a-t-il un moyen d'incrémenter la valeur de hachage d'un", que voulez-vous dire? Vous voulez augmenter chaque élément du hachage d'un? "Créer un tableau pour le hachage"? Vous voulez mettre le hachage dans un tableau? 'push @list, \% hash'? – Qtax

+1

Veuillez fournir des exemples de données, avant et après le mangling. – daxim

+1

Je comprends que vous avez un hachage, et vous avez un tableau, vous avez des comptes dans le hachage, mais pas dans le tableau. Mais après ça, tu m'as perdu. Il serait plus facile de vous aider si vous décrivez le problème, au lieu de décrire votre solution (cela ne fonctionne pas) au problème. – TLP

Répondre

2

La grande chose à propos de Perl est qu'il n'y a pas besoin d'initialiser un hachage ou un tableau, vous en créez simplement un.

Vous dites que vous êtes un nouvel utilisateur de Perl, mais vous semblez connaître les références. Vous pouvez lire un excellent tutorial juste à l'intérieur du Perl documentation. Vous pouvez le faire en utilisant la commande perldoc à partir de votre ligne de commande.

Cela dit, et en regardant votre demande, je peux voir plusieurs différents types de structures de données:

  • tableau de hachages: Dans cette structure, vous auriez un tableau pour chaque section » re frapper, et vous numérotez les sections de 0 au maximum que vous avez frappé. Vous stockez le nombre de chaque entrée dans un hachage pour cette entrée.

Le code ressemblerait à quelque chose comme ceci:

my $section_number = -1; #We'll increment this to one on the first section number 
my @data;     #This is an array where you'll store your sections 

while (my $line = <$my_file>) { 
    chomp $line; 
    if ($line =~ /^>this is my \w+ statement$/) { 
     $section_number++; 
     $data[$section_number] = {}; #A reference to a hash 
    } 
    else { 
     $data[$section_number]->{$line}++; 
    } 
} 

La première partie de l'instruction if est simplement incrémenter le compte de la section, de sorte que chaque paramètre est stocké dans une autre section. C'est bien si la question est Dans la section #x, combien de fois avez-vous vu le paramètre "y"?.

  • HASHTABLE des tableaux: Cette fois, vous gardez une trace du paramètre, la section de ce paramètre apparaît dans.Ceci est l'inverse de ce qui précède, mais est bon pour répondre à la question Combien de fois le paramètre "y" apparaît dans chaque section?

Le code ressemblerait à quelque chose comme ceci:

my $section_number = -1; #We'll increment this to one on the first section number 
my %data;     #This is an array where you'll store your sections 

while (my $line = <$my_file>) { 
    chomp $line; 
    if ($line =~ /^>this is my \w+ statement$/) { 
     $section_number++; 
    } 
    else { 
     if (not exists $data{$line}) { 
      $data{$line} = []; #This hash will contain a ref to an array 
     }   
     $data{$line}->[$section_number]++; 
    } 
} 

Une autre possibilité est d'utiliser un Hash de Hashes que TLP a montré. Le point est que lorsque vous parlez d'une structure qui contient plus que de simples données scalaires, vous devez utiliser des références.

La façon dont vous voulez construire votre structure de données dépend vraiment de vous et dépend de ce que vous voulez suivre et de la façon dont vous voulez accéder à ces données. Comme indiqué dans cette question, il existe au moins trois façons différentes de structurer vos données. Et, construire cette structure de données complexe est assez facile. Et, il n'y a vraiment rien à initialiser. Une fois que vous avez compris les références, votre structure de données peut être aussi complexe que vous l'osez (bien que je suggère de commencer à chercher dans les techniques de codage Perl orientées objet avant de les déchaîner). Par ailleurs, aucune des réponses ne mentionne comment accéder à vos données en plus d'utiliser Data::Dumper, mais une simple boucle suffirait. Ceci est pour un tableau de hachages:

my $section = 0; 
while ($section <= $#data) { 
    my %param_hash = %{$data[$section]}; 
    foreach my $parameter (sort keys %param_hash) { 
     print "In section $section: $parameter appears $param_hash{$parameter} times\n"; 
    } 
    $section++; 
} 
1

Je ne suis pas sûr de ce que vous demandez, mais une bonne façon de commencer est peut-être d'ajouter simplement toutes vos données à un hachage, puis extraire les données dont vous avez besoin de ce hachage.

use strict; 
use warnings; 
use Data::Dumper; 

my %count; 
my $section; 
while (<DATA>) { 
    chomp; 
    if (/^section/) {  # some check to tell sections apart 
     $section = $_; 
    } else { 
     $count{$section}{$_}++; 
    } 
} 

print Dumper \%count;  # see what your structure looks like 
my @array = values %count; # if you don't like hashes 

__DATA__ 
section1 
param1 
param2 
param2 
param3 
section2 
param1 
param2 
param3 
param1 
section3 
param4 
param1 
param1 
param2 
section4 
param1 
param3 
+0

Merci d'avoir répondu. – NumbersInMyHead

0

Construire un hachage anonyme du nombre de mots. À la fin de chaque section, poussez le hachage sur le tableau et démarrez un nouveau hachage anonyme. Le code ci-dessous implémente ceci. (L'appel à Data::Dumper est là que pour démontrer la structure de données qui a été construit.)

use strict; 
use warnings; 

my $sect; 
my @counts; 

while (<DATA>) { 
    if (/^(\w+)/) { 
    $sect->{$1}++; 
    } 
    elsif ($sect) { 
    push @counts, $sect; 
    undef $sect; 
    } 
} 

use Data::Dumper; 
$Data::Dumper::Sortkeys = 1; 
print Data::Dumper->Dump([\@counts], ['*counts']); 


__DATA__ 
-------------------- 
>this is my first statement 
Parameter1 
Parameter2 
Parameter3 
Parameter2 
-------------------- 
>this is my second statement 
Parameter1 
Parameter2 
Parameter3 
-------------------- 
>this is my third statement 
Parameter1 
Parameter2 
Parameter2 
Parameter3 
-------------------- 
>this is my fourth statement 
Parameter1 
Parameter2 
-------------------- 
>this is my fifth statement 
Parameter1 
Parameter2 
Parameter3 
Parameter4 
-------------------- 

SORTIE

@counts = (
    { 
    'Parameter1' => 1, 
    'Parameter2' => 2, 
    'Parameter3' => 1 
    }, 
    { 
    'Parameter1' => 1, 
    'Parameter2' => 1, 
    'Parameter3' => 1 
    }, 
    { 
    'Parameter1' => 1, 
    'Parameter2' => 2, 
    'Parameter3' => 1 
    }, 
    { 
    'Parameter1' => 1, 
    'Parameter2' => 1 
    }, 
    { 
    'Parameter1' => 1, 
    'Parameter2' => 1, 
    'Parameter3' => 1, 
    'Parameter4' => 1 
    } 
); 
+0

merci de prendre le temps de répondre. – NumbersInMyHead

Questions connexes