2011-02-12 10 views
0

je suis nouveau à perl, et excusez-moi si ma question confuse.Perl multidimensionnel tableau recherche

J'ai un tableau multidimensionnel qui a 4 colonnes et beaucoup de lignes.

besoin de rechercher si le premier élément de chaque ligne correspond à une variable.

si correspond, concaténer une autre variable dans la 3ème colonne. si aucune correspondance, appuyez sur la même matrice.

exemple:

obtenir 4 différentes variables provenant d'autres boucles/logique.

$var1, $var2, $var3, $var3

et en les poussant à un tableau de température.

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

avant de les pousser tableau principal que je dois vérifier, si var1 existe déjà dans le colonne1 de @new array. s'il existe, concaténer la troisième colonne de la même ligne.

si var1 n'existe pas dans la colonne 1 de @new array, appuyez sur @local2 sur @new.

Si quelqu'un sait comment je fais cela, s'il vous plaît poster comment et ce sera grandement apprécié.

merci :)

+2

Qu'avez-vous essayé jusqu'à présent et qu'est-ce qui a cassé? Quelle documentation sur les "tableaux multidimensionnels" avez-vous lus et sur "recherche dans les tableaux" en Perl? – DVK

+0

J'ai essayé d'utiliser pour et si les déclarations .. et qui commence à vérifier chaque ligne, chaque fois. il y aura une ligne en dernier, mais la condition if ne correspond pas aux lignes précédentes et continue à les ajouter. en fait, il y a un vrai match dernier. par exemple. dans la rangée 15, il y aura match. mais toutes les 14 lignes, la condition devient fausse, et ajouter les entrées. – Siva

+0

Pourquoi ne pas mettre à jour votre question avec le code que vous avez? Cela rendra beaucoup plus facile de vous aider de cette façon. – bvr

Répondre

0

La description était un peu vague, mais cela pourrait faire ce que vous voulez. La partie dont vous avez besoin se situe entre les balises '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

Vous ne dites pas comment votre tableau est organisé. S'il s'agit d'un tableau de lignes, la fonction de carte est l'outil que vous voulez. Écrivez du code qui fonctionne pour une seule ligne, puis utilisez map pour l'appliquer à chaque ligne et collectez les résultats.

Questions connexes