2009-07-10 4 views
0

Je stocke des valeurs dans un tableau à l'aide de la fonction push. La première valeur dans le tableau est stockée à 4 éléments au lieu du premier élément. Par exemple, après avoir stocké des valeurs lorsque j'imprime le premier élément $array[1] il imprime l'espace/rien mais quand j'imprime le quatrième élément $array[4] il imprime la première valeur. Des suggestions sur la façon de supprimer les valeurs indésirables en début de tableau?Comment puis-je supprimer les valeurs indésirables du début d'un tableau en Perl?

+3

Que pousses-tu dans ton tableau? Ca peut être le problème. On dirait que vous êtes en train de pousser un tableau dans un autre au lieu de pousser un scalaire. D'ailleurs, le premier élément est à l'index 0, pas 1. – jeje

+0

@ jeje: je pousse des valeurs après avoir fait correspondre les regex. quelque chose comme ceci: push (@value, join ("", $ file = ~/$ find /)) – shubster

+0

@shubster Ok, donc vous poussez un tableau (apparemment de 5 éléments) dans votre tableau @value. – jeje

Répondre

2
while (value_meets_shubster_s_definition_of_crap($array[0])) { 
    shift @array; 
} 

sub value_meets_shubster_s_definition_of_crap { 
    my $value = shift; 
    &helip; 
    return true or false; 
} 

& hellip; mais il serait préférable d'éviter de mettre des valeurs de "merde" sur le tableau en premier lieu.

+0

"il serait préférable d'éviter de mettre des valeurs de" merde "sur le tableau en premier lieu." - Merci pour cela, j'avais oublié une règle d'or. – Structure

0

Si vous voulez éliminer toutes les valeurs non désirées:

@array = grep { not value_meets_shubster_s_definition_of_crap($_) } @array; 

Cependant, comme l'a souligné David Dorward, ce qui élimine les valeurs non désirées à partir du milieu du tableau ainsi. Pour se débarrasser des seules valeurs au début, vous pouvez utiliser first_index de List::MoreUtils qui pourrait être plus efficace qu'une boucle de shift s:

#!/usr/bin/perl 

use strict; 
use warnings; 

use List::MoreUtils qw(first_index); 

my @array = (0, 1, 0, 2); 
my $begin = first_index { not is_unwanted($_) } @array; 

@array = @array[ $begin .. $#array ]; 

print "@array\n"; 

sub is_unwanted { 
    my ($v) = @_; 
    return if $v; 
    return 1; 
} 

__END__ 

Sortie:

C:Temp> yjk 
1 0 2 

Mise à jour: Mon l'intuition semble avoir été erronée:

#!/usr/bin/perl 

use strict; 
use warnings; 

use Benchmark qw(cmpthese); 
use List::MoreUtils qw(first_index); 

my @array = (0, 1, 0, 2, 3, 4, 5, 6, 7, 8, 9); 

cmpthese -10, { 
    'first_index' => \&using_first_index, 
    'shift'  => \&using_shift, 
    'nop'   => \&nop, 
}; 

sub using_first_index { 
    my @result = @array; 
    my $begin = first_index { not is_unwanted($_) } @result; 
    @result = @result[ $begin .. $#result ]; 
} 

sub using_shift { 
    my @result = @array; 
    shift @result while is_unwanted($result[0]); 
} 

sub nop { my @result = @array; } 

sub is_unwanted { 
    my ($v) = @_; 
    return if $v; 
    return 1; 
} 

Résultats:

   Rate first_index  shift   nop 
first_index 75767/s   --  -71%  -89% 
shift  258810/s  242%   --  -61% 
nop   664021/s  776%  157%   -- 
+1

Cela laisserait passer les valeurs de "crap" au milieu du tableau. La question précisait le début :) – Quentin

+0

@David Dorward: ITYM * éliminer *. –

4

Vous pouvez supprimer des éléments du recto d'un tableau à l'aide de l'opérateur 'shift'.

Mais je pense que le problème est plus profond que cela et que vous le regardez de la mauvaise façon. Si vous stockez des valeurs inconnues, «non désirées» dans un tableau, vous devez déterminer où et pourquoi cela se produit et l'empêcher, et ne pas simplement contourner celles-ci pour trouver ce que vous cherchez.

2

Comment créez-vous la matrice? En utilisant mes incroyables pouvoirs d'ESP, je vais deviner que vous avez un split quelque part qui garde les champs vides. Si je me trompe, vous devrez nous en dire plus sur ce que vous faites. Vous avez un peu un problème XY ici. Vous nous demandez comment implémenter une solution que vous avez déjà choisie plutôt que de nous laisser résoudre le problème.

Questions connexes