2012-01-15 4 views
0

Это может быть простой надзор с моей стороны (или что-то гораздо более продвинутое, чем мой набор навыков). Я пытаюсь динамически заполнить 2d ассоциативный массив, читая ввод из файла.Perl Динамически генерируемый многомерный ассоциативный массив

my @data; 
while (<FILE>) { 
    chomp; 

    my $ID,$COUNT; 
    print "READ: " . $_ . "\n"; #Debug 1 

    ($ID,$COUNT,undef,undef,undef) = split /\,/; 
    print "DATA: " . $ID . "," . $COUNT . "\n"; # Debug 2 

    $data{$ID}{"count"} = $COUNT; 
    #push @{$data{$ID}{"count"}}, $COUNT; 

       print $data{$ID}{"count"} . "\n"; # Debug 3 
} 

Первая печать (отладка 1) напечатает строку, похожую на des313,3 ,,,.

Вторая печать (отладка 2) будет печатать линию передачи данных: des313,3

Третья печать (3) отладка будет печатать пустую строку.

Проблема, кажется, в том, что я пытаюсь вставить данные в ассоциативный массив. Я пробовал как прямую вставку, так и метод push без каких-либо результатов. Я сделал это с PHP, но я думаю, что я не замечаю этого в Perl. Я просмотрел страницу perldoc perldsc в разделе HASHES из HASHES, однако я не видел, чтобы она говорила о динамической генерации их. Любые предложения были бы замечательными!

+0

Хотя это может быть улучшен код отлично работает для меня, как она стоит. Третья строка отладки правильно печатает сохраненное значение $ COUNT. Повторите этот код и сообщите нам, какие результаты вы получите, и содержимое файла данных, который вы используете. – Borodin

+0

Если вы изучаете Perl из источника, который использует термин «ассоциативный массив», то он почти наверняка устарел. Пожалуйста, найдите то, что не старше 15 лет. –

ответ

5

Назначение хэша так, как вы должны работать нормально. Вы неправильно указываете свои переменные. Ваш ассоциативный массив называется хешем в Perl и имеет префикс % sigil, поэтому вы должны написать my %data перед циклом while. Внутри цикла оператору my нужны парсеры для применения к списку, поэтому он должен быть my ($ID, $COUNT);.

Этот минимальный пример работает правильно:

use warnings; # place these lines at the top of all of your programs 
use strict; # they will catch many errors for you 

my %data; # hash variable 
while (<DATA>) { 
    chomp; 
    my ($id, $count) = split /,/; # simplify the split 

    $data{$id}{count} = $count; # build your hash 
} 

print "got: $data{des313}{count}\n"; # prints "got: 3" 

__DATA__ 
des313,3 
+0

Принимая решение, оно работает отлично. Однако, если я вношу изменения в свой код, это даже после устранения некоторых проблем. – jinanwow

+0

После некоторого устранения неполадок выяснилось, что происходит. В моем заявлении для печати было напечатано $ data {$ ID} {count}. "\ n" (дополнительное пространство перед \ n). Я удалил лишнее пространство, и я получил результаты, которые я хотел. Не уверен точно, как дополнительное пространство приведет к отсутствию выхода, однако оно работает сейчас. Благодаря! – jinanwow

Смежные вопросы