2010-08-03 6 views
1

Perl новичок здесь ... У меня была помощь с этим рабочим скриптом perl с некоторым кодом HASH, и мне просто нужна помощь в понимании этого кода, и если бы он мог быть написан так, что я бы понял использование HASHES проще или визуально?помогите понять perl hash

Таким образом, скрипт выполняет регулярное выражение для фильтрации по дате, а остальное регулярное выражение будет извлекать данные, относящиеся к этой дате.

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"; 
} 

То, что я пытаюсь понять эти строки:

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

И снова пару линий вниз:

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

Это пример ссылки на хэш? хэш хешей?
Я думаю, я запутался с использованием {$} множества :-(

+2

Если вы еще не прочитали [perldoc perlreftut] (http://perldoc.perl.org/perlreftut.html) и [perldoc perldsc] (http://perldoc.perl.org/perldsc.html), они были бы хорошие места для начала. – hobbs

+0

@hobbs - спасибо, есть хорошие примеры. – jdamae

ответ

4

%items является хэш хэш ссылок (концептуально, хэш хэшей). $set ключ в %items, а затем вы получите обратно другой хэш, который добавляется к с ключами 'a-logdate' и 'a-dataset'.

(скорректированный с учетом замечаний) ответ

+0

Благодарим вас за ответ. Когда вы говорите «тогда вы возвращаете еще один хеш» с двумя новыми ключами ... тогда это относится к самому себе? – jdamae

+0

Нет, концептуально каждая пара значений ключа хеша в элементах является ключом к другому хешу. $ set - это ключ в% элементов. Вы возвращаете еще один хэш для каждой клавиши. Это похоже на двухуровневое дерево. $ set - это первый уровень, тогда a-logdate является вторым уровнем. –

2

Лу Франко близок, с одной незначительной опечаткой — хэш хэш ссылок является %items, не $items . Это ссылка красный до $items{key}, когда вы извлекаете значение из %items, потому что значение, которое вы извлекаете, является скаляром (в данном случае хеш-ссылкой), но $items будет другой переменной.

+0

Исправил мой ответ на основе этой информации - спасибо. –