2013-08-13 2 views
-1

У меня есть список строк (около 2K), которые мне нужно сравнить со значительно большим списком по определенным критериям и сохранить результаты. Так что я делаю:Устранение списка в цикле

foreach(keys %lines1) 
{ 
    ($orig1,$orig2,$orig3) = (split(/,/, $lines1{$_}))[1,2,3] 
    push(@result, grep{ ($data1,$data2,$data3) = (split(/,/, $lines2{$_})[1,2,3];$orig1 == $data1 && $orig2 == $data2 && $orig3 == $data3 } keys %lines2); 
    $hash_result{$count} = @result; 
} 

Проблема @result накапливает данные. Итак, при первом запуске он равен 1, на втором - данные, а размер соответствует 2: старая строка и соответствующая новая строка.

Я чувствую, что мне не хватает чего-то очевидного, но не помню, что.

Оба списка относятся к тому же файлу, что и CSV. Они отличаются друг от друга одним полем.

Вход:

data1,data2,data3,data4,data5,data6,data7,data8,0 - $line1 
data1,data2,data3,data4,data5,data6,data7,data8,1 - $line2 

Существует несколько линий типа $line1.

Выход: В выходном файле, вероятно, должен быть хэш списка списка. Задача: для каждого $line1, которые имеют совпадение, вычисляют некоторую статистику.

Не могли бы вы помочь?

Возможно, я делаю это совершенно неправильно?

[EDIT]

Что я ищу здесь что-то вроде этого:

«$ hash_result {$} граф = [[1,2,3,10,4,6] [ 1,2,3,5,3,11] [1,2,3,100,60,20]] "

, так что я могу рассчитать некоторую статистику по линии $ count.

[/ EDIT]

+0

@mpapec, добавлено объяснение. Спасибо. – Igor

+0

Откуда приходит счет '$? '@ result', конечно, накапливать данные, когда вы нажимаете на них на каждой итерации цикла. – Toto

+0

@ M42, точно. Вы знаете, как очистить список? Проблема в том, что в% строк2 может быть несколько строк, соответствующих% lines1. Переменная $ count - это просто счетчик, который я использую, чтобы отслеживать хэш. AFAIK, я не могу использовать «$ hash_result {@result}», поэтому вместо этого использую «$ count». – Igor

ответ

0

Добавление вычисление среднего

foreach(keys %lines1) { 
    ($orig1,$orig2,$orig3) = (split(/,/, $lines1{$_}))[1,2,3] 
    @result = grep{ ($data1,$data2,$data3) = (split(/,/, $lines2{$_})[1,2,3];$orig1 == $data1 && $orig2 == $data2 && $orig3 == $data3 } keys %lines2); 
    push @{$hash_result{$count}}, [ @result ]; 
} 
my $average= 0; 
foreach my $list (@{$hash_result{$count}}) { 
    $average+= $list->[3]; # 10 + 5 + 100 
} 
$average/= scalar(@{$hash_result{$count}}); # 10+5+100/3 
+0

, который сработал. Спасибо. – Igor

+0

Видимо, я был слишком быстр. Насколько я понимаю, «@result» будет иметь один плоский список, а не список списков, не так ли? Потому что я ищу: $ hash_result {$ count} = [[1,2,3,10,4,6], [1,2,3,5,3,11], [1,2 , 3,100,60,20]]. Таким образом, я смогу посчитать некоторые статистические данные по результирующему списку списков. Но вы получите код $ hash_result {$ count} = [1,2,3,10,4, 6,1,2,3,5,3,11,1,2,3,100,60,20] «Спасибо. – Igor

+0

'$ hash_result {$ count} = @result;' такой же, как '$ hash_result {$ count} = $ # result + 1;' Как '$ hash_result {$ count}' быть массивом? –

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