Comment soustraire un tableau d'un tableau?
Quand j'ai essayer le suivant
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @bl = qw(red green blue);
my @a = qw(green yellow purple blue pink);
print Dumper [grep {not @bl} @a];
- Je obtenir un tableau vide. Je me serais attendu que @bl
a été soustraite de @a
de sorte que la sortie a été yellow purple pink
.
Quel est le problème ici?
source d'informationauteur Sandra Schlichting | 2011-02-03
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin pour transformer
@bl
dans une table de hachage pour effectuer la différence:Voir perlfaq4: Comment puis-je calculer la différence de deux tableaux?
Dans votre code,
not
est probablement pas faire ce que vous pensez qu'il est en train de faire.not @bl
sera toujours1
si@bl
est un tableau vide, etundef
si@bl
n'est pas vide.Cela ne veut pas dire "éléments pas dans
@bl
" dans tous les sens.@b1
évalue à true (c'est un tableau avec un nombre différent de zéro des éléments), de sorte que le boolean test dans votre grep construire (not @b1
) renverra toujours false. grep filtres un tableau en ne retournant que les éléments pour lesquels la boolean test renvoie la valeur true.Vous avez besoin de tester pour voir si
$_
(l'élément de tableau actuellement en cours d'examen) est en@bl
ou pas. Une façon de le faire est de générer un temporaire de hachage à l'aide de@bl
comme les clés, puis dans votre grep déclaration de vérifier la présence de$_
dans les clés de hachage:Depuis Perl 5.18.0 la smartmatch opérateur est considérée comme expérimentale:
Le smartmatch famille de fonctions sont désormais expérimentale.
Parce que je ne voudrais pas utiliser cette solution ci-dessous.
D'une autre façon avec le Smartmatch-opérateur ( si vous avez perl-version 5.010 ou plus ):
Une autre option à l'aide de perl5i:
D'une autre manière, à l'aide de la
minus
fonction de la Acme::Outils module CPAN:Une autre façon est d'utiliser: