comment combiner deux prochains si ensemble
J'ai un script qui s'exécute sur la liste des fichiers pour faire certaines des modifications, chaque fichier d'entre eux a un événement d'appel et les détails de l'événement d'appel contiennent 4 éléments donc je veux juste faire les changements sur 2 d'entre eux seulement ici je ' next if
Je ne sais pas comment combiner deux boucles en une seule boucle, ici, j'ai utilisé 2 boucles pour faire le travail mais cela prend plus de temps, y a-t-il une idée sur la façon de faire cela?
my $calleventtag = $struct->{'transferBatch'}->{'callEventDetails'};
my @indexes = reverse (grep { exists $calleventtag->[$_]->{'supplServiceEvent'} } 0..$#$calleventtag);
my $sup_event_cnt = $#indexes;
foreach my $index (@indexes)
{
splice (@$calleventtag , $index,1);
}
foreach (0..$#$calleventtag)
{
next if ( ! exists $calleventtag->[$_]->{'mobileOriginatedCall'}) ;
if ( exists $calleventtag->[$_]->{'mobileOriginatedCall'}->{'basicCallInformation'}->{'destinationNetwork'} )
{
delete $calleventtag->[$_]->{'mobileOriginatedCall'}->{'basicCallInformation'}->{'destinationNetwork'};
}
if ( exists $calleventtag->[$_]->{'mobileOriginatedCall'}->{'basicCallInformation'}->{'chargeableSubscriber'}->{'simChargeableSubscriber'}->{'msisdn'}
&& $calleventtag->[$_]->{'mobileOriginatedCall'}->{'basicCallInformation'}->{'chargeableSubscriber'}->{'simChargeableSubscriber'}->{'msisdn'} !~ m/^96279/
)
{
delete $calleventtag->[$_]->{'mobileOriginatedCall'}->{'basicCallInformation'}->{'chargeableSubscriber'}->{'simChargeableSubscriber'}->{'msisdn'};
}
}
foreach (0..$#$calleventtag)
{
next if ( ! exists $calleventtag->[$_]->{'gprsCall'});
if ( exists $calleventtag->[$_]->{'gprsCall'}->{'gprsBasicCallInformation'}->{'gprsDestination'}->{'accessPointNameOI'} )
{
delete $calleventtag->[$_]->{'gprsCall'}->{'gprsBasicCallInformation'}->{'gprsDestination'}->{'accessPointNameOI'};
}
}
for (...) {
next if ...;
...
}
peut également être écrit comme
for (...) {
if (!...) {
...
}
}
Vous pouvez utiliser les éléments suivants:
use Data::Diver qw( Dive );
my $call_event_details = Dive($struct, qw( transferBatch callEventDetails ));
for my $call_event_detail (@$call_event_details) {
next if !$call_event_detail->{supplServiceEvent};
if ( my $bci = Dive($call_event_detail, qw( mobileOriginatedCall basicCallInformation )) ) {
delete $bci->{destinationNetwork};
if ( my $scs = $bci->{simChargeableSubscriber} ) {
my $msisdc = $scs->{msisdn};
delete $scs->{msisdn} if $msisdc && $msisdc !~ /^96279/;
}
}
if ( my $dest = Dive($call_event_detail, qw( gprsCall gprsBasicCallInformation gprsDestination )) ) {
delete $dest->{accessPointNameOI};
}
}
Remarques:
- Les guillemets autour des littéraux de chaîne ne sont pas nécessaires dans les index de hachage si la chaîne est un identificateur valide valide. Par exemple,
$hash->{'foo'}
peut être écrit comme$hash->{foo}
. ->
n'est pas nécessaire entre deux index. Par exemple,$hash->{foo}->{bar}
peut être écrit comme$hash->{foo}{bar}
.- Si un élément de hachage est une référence ou n'existe pas, vous n'avez pas besoin d'utiliser
exists
pour vérifier si vous avez une référence; vous pouvez utiliser un simple test de vérité puisque les références sont toujours vraies. [BUG FIX]
$hash->{foo}{bar}
peut s'autovivifier$hash->{foo}
(provoquer une référence à lui être assignée), donc vos tests pour vérifier si des éléments existent pourraient en fait provoquer la création de choses. Pour résoudre ce problème, vous pouvez remplacerif ($hash->{foo}{bar})
avec
if ($hash->{foo} && $hash->{foo}{bar})
ou
if (Dive($hash, qw( foo bar )))
L'utilisation
->{foo}{bar}{baz}
répétée de la même longue chaîne d'index ( ) est sujette aux erreurs.- Il est préférable d'utiliser des noms pluriels pour les tableaux. Tout d'abord, c'est plus descriptif, mais cela facilite également le choix des noms pour les variables de boucle.
- En parlant de noms de variables, pourquoi utiliser
$calleventtag
pour le nom de la variable contenant descallEventDetails
nœuds? - Vous n'avez pas besoin de vérifier si un élément de hachage existe avant d'essayer de le supprimer;
delete
peut être passé un élément qui n'existe pas. - Pas besoin de boucler sur les index d'un tableau si vous n'avez pas besoin des index.
grep
était un bon choix, mais cesplice
n'était pas le cas. Vous devriez avoir utilisé:$calleventtag = [ grep { ... } @$calleventtag ];
. J'ai déplacé le chèque dans la boucle.