Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
|
Re 18.01.06 01:41 Число просмотров: 2226
Автор: Heller <Heller> Статус: Elderman Отредактировано 18.01.06 01:51 Количество правок: 1
|
> Всем привет > Есть хеш, %file где ключем является имя файла, а значением: > его контрольная сумма > Как можно получить все имена файлов, у которых контрольная > сумма совпадает? Собственно встречный вопрос: если, допустим, хэш у нас такой:
f1 - A
f2 - B
f3 - C
f4 - A
f5 - B
(A, B, C - хэши, fN - файлы), то что мы должны получить на выходе:
a). массив "f1, f2, f4, f5"
б). два массива "f1, f4" и "f2 ,f5"
В общем случае делай так:
1. Создаешь массив
@keys=keys %filehashes
в нем будут лежать все имена файлов.
2.
@files=();
push @files, (pop @keys);
$hash=$filehashes{$files[0]};
delete ($filehashes{$files[0]});
for ($i=0;$i<=$#keys;$i++) {
if ($filehashes{$keys[$i]} eq $hash) {
push @files, $keys[$i];
delete ($filehashes{$keys[$i]} );
@keys=(@keys[0..($i-1)],@keys[($i+1)..$#keys]);
}
}
Такая процедура возмет первый файл из массива @keys и занесет в массив @files имена всех файлов с тем же самым хешем. При этом из изначального хеша и массива @keys все эти имена файлов будут удалены. Для удаления элемента из массива я использовал конструкцию
@keys=(@keys[0..($i-1)],@keys[($i+1)..$#keys])
это вообще не лучший вариант и это обычно делается по-другому, но я в данный момент не имею доступа к Perl'у и как это делается "правильно" запамятовал. Конечно, эту строчку лучше поправить.
3. В зависимости от того, что требуется. Если твой случай - это вариант а), то просто добавляй полученный массив@files к третьему массиву, который и будет результирующим. Если у тебя вариант б), то тебе потребуется "массив массивов". Добавлять массивы (вернее, ссылки на них) в массив массивов можно так:
push @array, [@files].
Здесь @array - массив массивов. Не уверен, что это сработает, так как Perl'а под рукой не имею, но скорее всего прокатит. В крайнем случае посмотри в Яндексе или доках - тут ничего сложного нет.
4. Все что уже написал оформляешь в цикле по всем элементам @keys.
|
<programming>
|
[Perl] Вопрос по хешам 17.01.06 21:25
Автор: Cyber_Onix Статус: Незарегистрированный пользователь
|
Всем привет
Есть хеш, %file где ключем является имя файла, а значением: его контрольная сумма
Как можно получить все имена файлов, у которых контрольная сумма совпадает?
|
|
можно поменять местами ключ и данные, т.е. проходя по всем... 18.01.06 13:13
Автор: sprohorov Статус: Незарегистрированный пользователь
|
> Всем привет > Есть хеш, %file где ключем является имя файла, а значением: > его контрольная сумма > Как можно получить все имена файлов, у которых контрольная > сумма совпадает?
можно поменять местами ключ и данные, т.е. проходя по всем записям в %file сформировать %sum, в котором ключем является контрольная сумма а значением имя файла, дальше дело техники
|
|
Re 18.01.06 01:41
Автор: Heller <Heller> Статус: Elderman Отредактировано 18.01.06 01:51 Количество правок: 1
|
> Всем привет > Есть хеш, %file где ключем является имя файла, а значением: > его контрольная сумма > Как можно получить все имена файлов, у которых контрольная > сумма совпадает? Собственно встречный вопрос: если, допустим, хэш у нас такой:
f1 - A
f2 - B
f3 - C
f4 - A
f5 - B
(A, B, C - хэши, fN - файлы), то что мы должны получить на выходе:
a). массив "f1, f2, f4, f5"
б). два массива "f1, f4" и "f2 ,f5"
В общем случае делай так:
1. Создаешь массив
@keys=keys %filehashes
в нем будут лежать все имена файлов.
2.
@files=();
push @files, (pop @keys);
$hash=$filehashes{$files[0]};
delete ($filehashes{$files[0]});
for ($i=0;$i<=$#keys;$i++) {
if ($filehashes{$keys[$i]} eq $hash) {
push @files, $keys[$i];
delete ($filehashes{$keys[$i]} );
@keys=(@keys[0..($i-1)],@keys[($i+1)..$#keys]);
}
}
Такая процедура возмет первый файл из массива @keys и занесет в массив @files имена всех файлов с тем же самым хешем. При этом из изначального хеша и массива @keys все эти имена файлов будут удалены. Для удаления элемента из массива я использовал конструкцию
@keys=(@keys[0..($i-1)],@keys[($i+1)..$#keys])
это вообще не лучший вариант и это обычно делается по-другому, но я в данный момент не имею доступа к Perl'у и как это делается "правильно" запамятовал. Конечно, эту строчку лучше поправить.
3. В зависимости от того, что требуется. Если твой случай - это вариант а), то просто добавляй полученный массив@files к третьему массиву, который и будет результирующим. Если у тебя вариант б), то тебе потребуется "массив массивов". Добавлять массивы (вернее, ссылки на них) в массив массивов можно так:
push @array, [@files].
Здесь @array - массив массивов. Не уверен, что это сработает, так как Perl'а под рукой не имею, но скорее всего прокатит. В крайнем случае посмотри в Яндексе или доках - тут ничего сложного нет.
4. Все что уже написал оформляешь в цикле по всем элементам @keys.
|
|
|