2010-11-11 28 views
3

Si je le tableau suivantPerl: Création d'un hachage à partir d'un tableau

my @header_line = ('id', 'name', 'age'); 

Comment puis-je créer un hachage de celui-ci correspond à la ligne ci-dessous?

my %fields = { id => 0, name => 1, age => 2}; 

La raison pour laquelle je veux faire ceci est que je puisse utiliser des noms significatifs plutôt que des nombres magiques pour les index. Par exemple:

$row->[$fields{age}]; # rather than $row->[2] 
+0

pourquoi ne pas changer 'row' de $ à'% row' (un hachage)? – knittl

+1

Il vient de Text :: CSV par exemple, my $ row = $ csv-> getline ($ fh) – FunLovinCoder

+2

Puisque vous avez @header_line, vous pouvez facilement transformer $ row en hash: 'my% row_hash = map {$ _ => shift @ {$ row}} @header_line; Juste une autre alternative, mais pourrait être plus propre en utilisant '$ row_hash {age}' que d'avoir à utiliser la notation '$ row -> [$ fields {age}]' ... – plusplus

Répondre

15
my %fields; 
@fields{@header_line} = (0 .. $#header_line); 
+0

+1 pour une solution concise! –

+0

+1 pour la solution la plus idiomatique – DVK

+0

Cela fonctionne parfaitement. Merci! – FunLovinCoder

1
my %fields =(); 
for (my $i = 0; $i < scalar(@header_line); $i++) { 
    $fields{$header_line[$i]} = $i; 
} 
0

TIMTOWTDI

my %fields =(); 
foreach my $field(@header_line) 
{ 
    %fields{$field} = scalar(keys(%fields)); 
} 
6
my %fields = map { $header_line[$_] => $_ } 0..$#header_line; 
+0

+ 1 pour une solution concise! –

2

Vous avez dit en réponse à un commentaire que cela vient de texte :: CSV. Ce module a un moyen d'importer ceci dans un hachage pour vous.

$csv->column_names(@header_line);
$row = $csv->getline_hr($FH);
print $row->{ 'id' };

+0

Ne connaissait pas les noms de colonnes et getline_hr - ils ont été ajoutés en 2008, donc relativement récent (en termes de texte :: CSV) .Rend le code beaucoup plus ordonné ... – plusplus

+0

I Le problème est $ csv_o-> print ($ fh_o, $ row), échoue car il attend un tableau ref Comment écrire le hash ref en utilisant l'objet csv_o? BTW, mon script lit en un CSV , ajoute des champs, modifie tous les noms de colonne (@header_line est un nouveau nom de col), puis écrit un nouveau fichier CSV f ile. Je n'avais pas apprécié ce dont j'avais besoin peut être juste sous mon nez. ** Merci beaucoup pour votre commentaire! ** – FunLovinCoder

+0

J'ai soulevé cette question comme étant tout à fait différente de celle-ci: http://stackoverflow.com/questions/4163048/perl-with-textcsv-can-i- write-out-a-hash-ref – FunLovinCoder