2011-02-12 5 views
0

Я новичок в perl, и извините, если мой вопрос смущает.Perl многомерный массив поиск

У меня есть многомерный массив, который имеет 4 столбца и много строк.

необходимо выполнить поиск, если первый элемент каждой строки соответствует переменной.

Если совпадает, сопоставьте другую переменную в третьей колонке. , если NO соответствует, нажмите на тот же массив.

пример:

получает 4 различных переменные из другой петли/логики.

$var1, $var2, $var3, $var3

и толкая их в массив темп.

push @local,$var1,$var2,$var3,$var4; 

перед отправкой их основной массив мне нужно проверить, если var1 уже существует в column1 из @new array. если существует, соедините третий столбец той же строки.

если var1 не существует в колонке 1 @new array, затем нажмите @local2 на @new.

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

спасибо :)

+2

Что вы пробовали до сих пор и что сломалось? Какую документацию по «многомерным массивам» вы читали и «искали в массивах» в Perl? – DVK

+0

Я пробовал использовать для и если утверждения .. и что каждый раз проверяет каждую строку. будет строка последней, но условие if не соответствует более ранним строкам и продолжает добавлять их. на самом деле, существует истинное соответствие последнему. например. в строке 15 будет матч. но все 14 строк, условие становится ложным и добавляет записи. – Siva

+0

Почему бы не обновить свой вопрос с помощью кода, который у вас есть? Это облегчит вам помощь таким образом. – bvr

ответ

0

описание было немного расплывчатым, но это может сделать то, что вы хотите. Часть, в которой вы нуждаетесь, находится между тегами 'CODE'.

#!/usr/bin/perl 

use strict; 
use warnings; 
use diagnostics; 
use Data::Dumper; 

my @new; # Array where data will be stored 

# Define test arrays that in turn will populate the four input variables 
my @testvariables = (
    [qw/a1 a2 a3 a4/], 
    [qw/b1 b2 b3 b4/], 
    [qw/v1 v2 v3 v4/], 
    [qw/c1 c2 c3 c4/], 
    [qw/v1 v2 vv3 v4/], 
    [qw/d1 d2 d3 d4/], 
    [qw/b1 b2 bb3 b4/], 
    [qw/v1 v2 vvv3 v4/] 
    ); 

# Test different values for input varibles 
foreach my $row_ref (@testvariables) {   # Each round gives us a new ref to an array 
    my ($var1, $var2, $var3, $var4) = @{$row_ref}; # Update test variables 
#-------------CODE-------------- 
    my $updated = undef;       # Create/clear flag. 
    foreach my $row_ref (@new) {     # Loop though existing arrays in @new 
     next unless ${$row_ref}[0] =~ /$var1/;  # Skip to next array in @new if $var1 does not match 
     ${$row_ref}[2] .= "_$var3";    # $var1 matched as we got this far. Concat third element 
     $updated = 1;        # Flag that concat was performed 
     last;          # No need to look for more matches in @new. 
    } 

    unless ($updated) {       # If $var1 was not found in @new, append variables as array to @new. 
     my @a = ($var1, $var2, $var3, $var4);  # Create array 
     push (@new, \@a);       # Add new array to 
    } 
#-------------\CODE------------- 
    print "-------------\n"; 
    print Dumper \@new; 
} 
0

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

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