2017-10-05 6 views
0

J'essaie d'entrer plusieurs fois un nombre qui peut être au moins de 1 chiffre et de 10 chiffres au maximum. Il devrait afficher ce nombre sur l'écran seulement s'il est pair et entre 1 et 10 chiffres, sinon il devrait quitter la boucle. J'ai essayé mon code mais je n'ai pas pu trouver la solution exacte. J'essaie de faire avec Regex. C'est juste pour la pratique et n'a pas d'autre signification.Comment imprimer un nombre pair de 1 à 10 chiffres en Perl en utilisant Regex

#!/usr/bin/perl/ 


while(<> =~ /^\d{1,10}$/) 
{ 
     my $num = <STDIN>; 
     if($num =~ /[123456789]+[02468]$/) 
     { print STDOUT $num; } 
} 

Répondre

2

Vous pouvez comme suit, vous demandez au stdin deux fois, d'abord, vous devez retirer le stdin intérieur de la boucle.

while(my ($num) = <> =~ /^(\d{1,10})$/) #Storing the digits in $num 
{ 

    if($num =~ /^\d*[02468]$/) 
    { 
     print "Even $num\n"; 
    } 
} 

En fait, vous essayez de faire correspondre deux chiffres, + quantificateurs correspond à atleast un personnage (ce qui est votre problème), et votre assortissent le même caractère [02468]. J'ai donc ajouté le * (correspondre 0 ou plusieurs fois) au lieu de +.

+0

Votre ou le conditionnement est inutile !! –

+0

Pouvez-vous s'il vous plaît aussi me dire où je me trompais? –

+1

@ShankhadeepMukerji Post édité. – mkHun

1

Il vous suffit de modifier votre code comme ça:

if($num =~ /^\d*[02468]$/) 
{ print STDOUT $num; } 

Run Here

+1

juste vous êtes ... mais il ne dérangeait pas n'importe quoi non plus ..... de toute façon mis à jour –

2

Je aurait encourage vivement de ne pas utiliser regex à faire des calculs. Les expressions régulières concernent la correspondance de motifs, pas les nombres. Cela ne fera que vous créer de la peine pour essayer de faire des tests «numériques» comme «c'est égal».

Mais la racine de votre problème est que vous lisez deux fois STDIN. <> en lit comme <STDIN>.

Alors que diriez-vous à la place:

#!/usr/bin/env perl 
use strict; 
use warnings; 

while (<>) { 
    my ($num) = m/^(\d{1,10})$/ or last; #exit loop if it doesn't match. 
    print $num,"\n" unless $num % 2; 
}