2010-08-03 8 views
1

Perl débutant ici ... J'ai eu de l'aide avec ce script perl de travail avec du code HASH et j'ai juste besoin d'aide pour comprendre ce code et s'il pourrait être écrit de manière à comprendre l'utilisation de HASHES plus facilement ou visuellement ??aider à comprendre perl hash

En résumé, le script exécute une regex pour filtrer la date et le reste de l'expression régulière extraira les données relatives à cette date.

use strict; 
use warnings; 
use constant debug => 0; 
my $mon = 'Jul'; 
my $day = 28; 
my $year = 2010; 
my %items =(); 

while (my $line = <>) 
{ 
    chomp $line; 
    print "Line: $line\n" if debug; 
    if ($line =~ m/(.* $mon $day) \d{2}:\d{2}:\d{2} $year: ([a-zA-Z0-9._]*):.*/) 
    { 
     print "### Scan\n" if debug; 
     my $date = $1; 
     my $set = $2; 
     print "$date ($set): " if debug; 
     $items{$set}->{'a-logdate'} = $date; 
     $items{$set}->{'a-dataset'} = $set; 
     if ($line =~ m/(ERROR|backup-date|backup-size|backup-time|backup-status)[:=](.+)/) 
     { 
      my $key = $1; 
      my $val = $2; 
      $items{$set}->{$key} = $val; 
      print "$key=$val\n" if debug; 
     } 
    } 
} 

print "### Verify\n"; 
for my $set (sort keys %items) 
{ 
    print "Set: $set\n"; 
    my %info = %{$items{$set}}; 
    for my $key (sort keys %info) 
    { 
     printf "%s=%s;", $key, $info{$key}; 
    } 
    print "\n"; 
} 

Ce que je suis en train de comprendre est ces lignes:

 $items{$set}->{'a-logdate'} = $date; 
     $items{$set}->{'a-dataset'} = $set; 

Et encore quelques lignes vers le bas:

 $items{$set}->{$key} = $val; 

Est-ce un exemple de référence de hachage? hash de hashes?
Je suppose que je suis confondu avec l'utilisation de {$ set} :-(

+2

Si vous n'avez pas lu [perldoc perlreftut] (http://perldoc.perl.org/perlreftut.html) et [perldoc perldsc] (http://perldoc.perl.org/perldsc.html) ils seraient bons endroits pour commencer. – hobbs

+0

@hobbs - merci, il y a quelques bons exemples ici. – jdamae

Répondre

4

%items est un hachage de références de hachage (sur le plan conceptuel, un hachage de hash). $set est la clé dans %items puis vous revenez un autre hachage, qui est ajoutée à l'aide des touches 'a-logdate' et 'a-dataset'.

(corrigée en fonction des commentaires)

+0

merci pour votre réponse. Quand vous dites "alors vous récupérez un autre hachage" avec 2 nouvelles clés ... alors est-ce qu'il se réfère à lui-même? – jdamae

+0

Non, conceptuellement chaque paire clé-valeur de hachage dans les éléments est une clé d'un autre hachage. $ set est une clé dans% items. Vous obtenez un autre hachage pour chaque clé. C'est comme un arbre à deux niveaux. $ set est le premier niveau, alors a-logdate est le deuxième niveau. –

2

Lou la réponse de Franco est proche, avec une erreur typographique mineure — le hachage de références de hachage est %items, pas $items C'est référence rouge à $items{key} lorsque vous récupérez une valeur de %items parce que la valeur que vous extrayez est un scalaire (dans ce cas, une référence de hachage), mais $items serait une variable différente.

+0

Corrigé ma réponse basée sur cette info - merci. –

Questions connexes