Хранение повторяющихся входных данных в отдельности в Perl - PullRequest
0 голосов
/ 29 февраля 2012

Я застрял в этой проблеме на несколько дней и не знаю, какую структуру данных мне следует использовать в Perl

Предположим, у меня есть этот файл со следующими входными данными:

lookup hello
lookup good night
good night

Я хочу иметь возможность хранить «lookup», связанный с «hello», «lookup», связанный с «спокойной ночи» и, наконец, «спокойной ночи», связанный с ничем другим.Должен ли я использовать хэш или массив?Если я задаю «поиск» в качестве ключа хеша, я потеряю «привет» информацию.Если я установлю «спокойной ночи» в качестве ключа, я потеряю 3-ю строку информации.

Что мне делать?

РЕДАКТИРОВАТЬ: Есть определенные ключевые слова (которые я назвал «поиск»)") которые имеют вещи, которые связаны с нимиНапример, за «паролем» последует фактический пароль, тогда как после «логина» не должно быть ничего после него.

Ответы [ 4 ]

1 голос
/ 29 февраля 2012

Похоже, вы хотите хэш массивов. Игнорируя вопрос о том, как решить, что ключ «спокойной ночи» вместо «хорошего» (и просто предполагая, что ключ должен быть «хорошим»), вы могли бы сделать что-то вроде:

#!/usr/bin/env perl

use strict;
use warnings;

my %hoa;   # hash of arrays
while(<>) {
    my @f = split;
    my $k = shift @f;
    $hoa{ $k } = [] unless $hoa{ $k };
    push @{$hoa{ $k }}, join( ' ', @f );
}

foreach my $k( keys( %hoa )) {
    print "$k: $_\n" foreach ( @{$hoa{ $k }}); 
}
1 голос
/ 29 февраля 2012

Не совсем ясно, как вы ожидаете разбить слова здесь, но в общем случае, если вам нужно выполнить случайный поиск (по произвольному слову), хеш лучше подходит, чем массив. Без дополнительных подробностей о том, что именно вы пытаетесь сделать здесь, трудно быть более конкретным.

0 голосов
/ 29 февраля 2012

Вы также можете использовать хэш хэшей, если вы планируете хранить другой фрагмент данных с вашим связанным «поиск» -> «спокойной ночи», к которому позже будет легко получить доступ. Например:

%result = (
   'lookup' => {
      'hello' => $storage1,
      'good night' => $storage2,
   },
   'good night' => {
   }
);
0 голосов
/ 29 февраля 2012

Не совсем уверен, что вы хотите, но это нормально:

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dump qw(dump);

# build a hash of keywords
my %kword = map{ $_ => 1}qw(lookup kword1 kword2);
my %result;
while(<DATA>) {
    chomp;
    my ($k, $v) = split(/ /,$_, 2);
    push @{$result{$k}}, $v  if exists $kword{$k};
}
dump%result;

__DATA__
lookup hello
lookup good night
good night
kword1 foo
kword1 bar

вывод:

("kword1", ["foo", "bar"], "lookup", ["hello", "good night"])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...