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++;
}
"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
Veuillez fournir des exemples de données, avant et après le mangling. – daxim
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