помочь понять Perl хэш - PullRequest
       25

помочь понять Perl хэш

1 голос
/ 03 августа 2010

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

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

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;

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

Ответы [ 2 ]

4 голосов
/ 03 августа 2010

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

(исправлено на основе комментариев)

2 голосов
/ 03 августа 2010

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

...