Perl поиск многомерных массивов - PullRequest
0 голосов
/ 12 февраля 2011

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

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

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

, если совпадает, объединить другую переменную в 3-м столбце. если НЕТ совпадений, нажмите на тот же массив.

пример:

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

$var1, $var2, $var3, $var3

и отправка их во временный массив.

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

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

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

если кто-нибудь знает, как я это делаю, пожалуйста, напишите, как это будет оценено.

спасибо:)

Ответы [ 2 ]

0 голосов
/ 13 февраля 2011

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

0 голосов
/ 12 февраля 2011

Описание было немного расплывчатым, но это может сделать то, что вы хотите.Часть, которая вам нужна, находится между тегами '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; 
}
...