заполнение многоуровневого хэша - PullRequest
1 голос
/ 01 июля 2011

У меня есть этот набор данных - меня интересует только идентификатор класса, процесс @ сервер: Я пытаюсь загрузить все три в многоуровневый хэш.

class_id: 995   (OCAive   )  ack_type: NOACK     supercede:  NO  copy:  NO  bdcst:  NO
PID                                    SENDS   RECEIVES   RETRANSMITS   TIMEOUTS MEAN    S.D.    #
21881  (rocksrvr@ith111          )          1          1             0          0
24519  (miclogUS@ith110          )          1          1             0          0
26163  (gkoopsrvr@itb101          )          1          1             0          0
28069  (sitetic@ith100           )         23          4             0          0
28144  (srtic@ithb10           )         33          5             0          0
29931  (loick@ithbsv115      )          1          1             0          0
87331  (rrrrv_us@ith102          )          1          1             0          0
                                  ---------- ----------    ---------- ---------- ------- ------- ------ 
                                          61         14             0          0

Когда я пытаюсь заполнить хэш, он не получает много (результаты дампа данных приведены ниже)

$VAR1 = '';
$VAR2 = {
    '' => undef
};

Это код:

#!/usr/bin/perl -w
use strict;
my $newcomm_dir = "/home/casper-compaq/work_perl/newcomm";
my $newcomm_file = "newcomm_stat_result.txt";

open NEWCOMM , "$new_comm_dir$newcomm_file";
while (<NEWCOMM>) {
    if ($_ =~ /\s+class_id:\s\d+\s+((\w+)\s+)/){
        my $message_class = $1;
    }
    if ($_ =~ /((\w+)\@\w+\s+)/) {
        my $process = $1;
    }
    if ($_ =~ /(\w+\@(\w+)\s+)/) {
        my $servers = $1;
    }

    my $newcomm_stat_hash{$message_class}{$servers}=$process;


    use Data::Dumper;
    print Dumper (%newcomm_stat_hash);
}

Ответы [ 4 ]

3 голосов
/ 01 июля 2011

Помимо проблемы объявлений, есть также несколько проблем с вашими выражениями регулярных выражений. Я бы посоветовал убедиться, что вы получите ожидаемый результат в каждой из переменных, прежде чем пытаться вставить его в хеш.

Во-первых, вам нужно сопоставить круглые скобки как \(, \), иначе они просто интерпретируются как контейнеры переменных.

2 голосов
/ 01 июля 2011

Ваши объявления my внутри if только имеют область видимости до конца блока if, и ваше хэш-присваивание не должно иметь my. Попробуйте объявить %newcomm_stat_hash перед циклом while и $message_class, $process и $servers в верхней части блока while.

Вы также, вероятно, хотите проверить свое открытие на неудачу; Я подозреваю, что вы пропустили / там.

1 голос
/ 01 июля 2011

Я подозреваю, что ваша основная ошибка в том, что ваш файл не открыт из-за отсутствия пути / между каталогом и именем файла.Вы можете использовать прагму autodie для проверки успешности открытия или использовать or die "Can't open file: $!".

У вас есть некоторые проблемы с областью действия.Во-первых, $message_class будет неопределенным во всем цикле, поскольку его область действия длится только внутри одной итерации.Возможно, вы также захотите иметь хеш вне цикла, если хотите иметь возможность использовать его позже.

Я поместил оператор next в проверку строки заголовка, так как другие проверки будут недействительнымив этой конкретной строке.Если вы хотите быть более точным, вы можете поместить все это вне цикла и просто выполнить однострочную проверку.

Вам не нужны две переменные для процесса и сервера, просто используйте их напрямую, иоба в одно и то же время.

Наконец, вы, вероятно, хотите отправить ссылку на хеш на Data::Dumper в распечатке, иначе хеш будет расширен, и печать будет несколько вводить в заблуждение.1015 *

1 голос
/ 01 июля 2011

Ваш файл открывается?

Я думаю, вам нужно изменить:

open NEWCOMM , "$new_comm_dir$newcomm_file";

Кому:

open NEWCOMM , $new_comm_dir.'/'.$newcomm_file;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...