2010-11-17 4 views
2

J'ai des problèmes pour imprimer mon contenu de hachage.Question sur le hachage Trier et imprimer en Perl

extrait de code comme cela,

#!/usr/bin/perl -w 
use strict; 
use warnings; 

my (%data, $keyword); 

while (my $line = <DATA>){ 
    next unless $line =~ /\S/; 
    chomp $line; 
    if ($line =~ /^Keyword/){ 
     $keyword = $line; 
    } 
    else { 
     push @{$data{$keyword}}, $line; 
    } 
} 

# How to sort by keys using while loop? 
while (my ($k,$v) = each %data) { 
    print "$k => $v\n"; 
} 

# BTW, foreach loop sorting works. 
#foreach my $key (sort (keys(%data))) { 
# print "$key \t$data{$key}\n"; 
#} 

__DATA__ 
Keyword1 
data1 a 
Keyword2 
data2 a 
data2 b 
data2 c 
Keyword3 


data3 a 
data3 b 


Keyword4 
data4 a 
data4 b 

Sortie:

D:\learning\perl>sc4.pl 
Keyword3 => ARRAY(0x18418fc) 
Keyword1 => ARRAY(0x28925c) 
Keyword2 => ARRAY(0x2892fc) 
Keyword4 => ARRAY(0x184360c) 

En fait, je ne pense pas que la valeur Mot_clé_1 (data1 a, seule ligne) est MATRICE. Mais la sortie montrait encore qu'il s'agissait d'un tableau.

Pourriez-vous me donner quelques suggestions sur comment l'imprimer correctement.

Apprécié pour votre contribution.

[mise à jour]

mettre à jour mon code pour while loop pour essayer d'imprimer le tableau de valeurs. mais toujours échoué.

while (my ($k,@v) = each %data) { 
    print "$k\n"; 
    foreach (@v) { 
    print Dumper (@v); 
    print "$_\n"; 
    } 
} 

sortie:

D:\learning\perl>sc4.pl 
Keyword3 
$VAR1 = [ 
      'data3 a', 
      'data3 b' 
     ]; 
ARRAY(0x189a674) 
Keyword1 
$VAR1 = [ 
      'data1 a' 
     ]; 
ARRAY(0x28925c) 
Keyword2 
$VAR1 = [ 
      'data2 a', 
      'data2 b', 
      'data2 c' 
     ]; 
ARRAY(0x2892fc) 
Keyword4 
$VAR1 = [ 
      'data4 a', 
      'data4 b' 
     ]; 
ARRAY(0x1841a74) 

I déjà défini une autre boucle foreach inclus pendant que la boucle de traiter les valeurs de tableau. Mais ça ne marche pas bien. Je ne sais pas pourquoi?

+1

Oui, même la valeur keyword1 est un tableau, parce que vous appuyez sur le tableau '$ data {mot-clé $}' - qui crée le tableau. – Konerak

Répondre

7

Tout d'abord, vous devez définir ce que vous entendez par "trier". Triez-vous par clés? Par des valeurs?

Si vous triez par clé, le plus simple est d'utiliser Perl sorte intégré comme celui-ci:

foreach (sort keys %data) { 
    print "$_ => $data{$_}; 
} 

Si vous voulez trier la valeur que vous pouvez définir une fonction de tri anonyme qui trie par valeur :

foreach (sort {$data{$a} <=> $data{$b}} keys %data) { 
    print "$_ => $data{$_}; 
} 

et si vous voulez un autre tri, vous pouvez définir une fonction qui fonctionne sur les variables globales $a et $b (ils sont automatiquement réglés par sort) et retourne -1, 0 ou 1 en fonction de l'ordre de tri.

Si vous devez le faire avec une boucle while, je vais devoir y réfléchir davantage.

0

Finalement, j'ai trouvé la solution pour imprimer un tableau de tableau en Perl.

J'ai mis à jour mon While Loop comme ci-dessous.

while (my ($k,@v) = each %data) { 
    print "$k\n"; 
    print Dumper (@v); 
    for (my $i = 0; $i < @v; $i++) { 
     for (my $j = 0; $j < @{$v[$i]}; $j++) { 
      print STDOUT "\$i: " . $i . " \$j: " . $j . " value: " . $v[$i][$j] . "\n"; 
     } 
    } 
} 

Sortie:

D:\learning\perl>sc4.pl 
Keyword3 
$VAR1 = [ 
      'data3 a', 
      'data3 b' 
     ]; 
$i: 0 $j: 0 value: data3 a 
$i: 0 $j: 1 value: data3 b 
Keyword1 
$VAR1 = [ 
      'data1 a' 
     ]; 
$i: 0 $j: 0 value: data1 a 
Keyword2 
$VAR1 = [ 
      'data2 a', 
      'data2 b', 
      'data2 c' 
     ]; 
$i: 0 $j: 0 value: data2 a 
$i: 0 $j: 1 value: data2 b 
$i: 0 $j: 2 value: data2 c 
Keyword4 
$VAR1 = [ 
      'data4 a', 
      'data4 b' 
     ]; 
$i: 0 $j: 0 value: data4 a 
$i: 0 $j: 1 value: data4 b 
1

Simplest façon, je sais:

use Smart::Comments; 
... 
### %data 

voir Smart::Comments.

Ce n'est pas ce que vous voulez faire comme une dernière étape, j'en suis sûr. Mais cela fonctionne dans les cas où vous voulez simplement jeter un coup d'œil sur ce que vous avez collecté.

Une autre façon est similaire:

use Data::Dumper; 
say Data::Dumper->Dump([ \%data ], [ '*data' ]); 
Questions connexes