Операция хеширования в Perl - PullRequest
       0

Операция хеширования в Perl

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

У меня есть сценарий здесь, и мне нужна помощь.Я пишу Perl-скрипт, который должен выполнить некоторые проверки.У меня есть файл, который содержит следующую информацию

patchname subpatch1, subpatch2, subpatch3 ...

Содержимое файлов должно быть прочитано, а подпатчи -помещается в массив.Теперь эти подпатчи могут содержать больше подпатчей, которые необходимо пройти, используя DFS или BFS, что будет показано позже.Но эти подпатчи должны быть сопоставлены с хэшем, пока они считываются из файла, т.е.

$list->{subpatch1} = \subpatch1
$list->{subpatch2} = \subpatch2
$list->{subpatch3} = \subpatch3 ....

с использованием split не помогает

($a1,$2)=split;

дает мне $ 2 = subpath1, subpatch2 ,.... который должен быть далее разделен .. Это становится действительно запутанным, особенно потому, что я новичок в perl.

Есть ли лучший способ выполнить вышеуказанное действие или есть какой-либо модуль, использующий это?достигнуты.Любые предложения будут очень полезны.

Ответы [ 2 ]

4 голосов
/ 08 февраля 2012

Вы можете разделить на несколько разделителей:

my ($name, @subs) = split /[\s,]+/;

perldoc -f split

2 голосов
/ 09 февраля 2012

Я думаю, что вы путаете списки и хэши. Список - это в основном массив ... это набор элементов, которые индексируются по номеру. Доступ к его элементам возможен только по индексу:

my $list = [ 'foo', 'bar', 'baz' ];
print $list->[0], "\n";   #prints foo
print $list->[2], "\n";   #prints baz

Хеш - это коллекция, индексированная по ключу, который вы решаете. Элементы ищутся этим ключом (в отличие от индекса, как в списке):

my $hash = { fookey => "foo", barkey => "bar", bazkey => "baz" };
print $hash->{'fookey'}, "\n";  # prints foo
print $hash->{'barkey'}, "\n";  # prints bar

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

patchname1 --relies on--> patchname2, patchname2, ...

Итак, что вам действительно нужно, так это один хеш, где ключи - это названия патчей, а значения - списки патчейнов:

my $patch_hash = {
    patchname1 => [ 'patchname2', 'patchname4' ],
    patchname2 => [ 'patchname3', 'patchname4' ],
    patchname3 => [ 'patchname4' ],
    patchname4 => [],
};

Где каждое уникальное patchname является ключом в patch_hash, значение которого является списком его зависимостей.

Как подсказывает инструмент, фактический анализ можно выполнить с помощью split, если вы укажете ему, на какие разделители делить. Оттуда вы можете заполнить ваш хэш что-то вроде:

my $patch_hash = {};
while( <FILE> ){
    my( $name, @subs ) = split /[\s,]+/;
    push( @{$patch_hash->{$name}}, @subs );
}

Это хорошая статья о массивах Perl.

Это хороший список функций для массивов Perl.

Это хорошая статья о хэше Perl.

И это хорошее резюме регулярного выражения Perl.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...