2017-10-21 95 views
-1

Juste une petite question à propos de ce code perl; Je suis chargé de prendre un scalaire STDIN et de le faire correspondre avec une ligne qui contient au moins 3 à 15 caractères entre guillemets (sans une autre citation dans les guillemets). Si c'est le cas, mon programme devrait imprimer "Oui", sinon "Non". Je me demande simplement s'il existe un moyen plus éloquent d'y parvenir? Je l'ai en travaillant avec ce code:Existe-t-il un meilleur moyen de faire correspondre cette regex à perl?

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

#2. Match a line that contains in it at least 3 - 15 characters between 
#  quotes (without another quote inside the quotes). 

say "Enter your input."; 
chomp(my $input = <STDIN>); 

if ($input =~ m/^"([^"])*"$/){ 

    if ($input =~ m/^".{3,15}"$/){ 
     say "Yes."; 
     } 
    else{ say "No.";} 
    } 
else{ say "No.";} 

Merci!

+4

'if ($ input = ~ m/^" [^ "] {3,15}" $ /) {say "Oui.";} Else {say "Non";} ' –

+0

Notez que' use 5.26.0' active implicitement 'strict', donc techniquement' use strict' est redondant. – melpomene

Répondre

1

Vous faites correspondre la même chaîne à deux regexes identiques. Cela peut facilement être un tout à la fois:

$_ = <>; 
say /"[^"]{3,15}"/ ? "Yes." : "No."; 

Notez aussi l'utilisation de l'opérateur tertiaire ?:, ce qui évite d'avoir à écrire un if/else construction où chaque bloc imprime juste un petit mot. Vous pouvez même se condenser à une seule ligne:

say <> =~ /"[^"]{3,15}"/ ? "Yes." : "No."; 

mais je ne pense pas que gagne tout prix de lisibilité.

Notez également que votre solution d'origine est erronée. Le premier modèle établit simplement que la ligne contient deux guillemets doubles, le second motif indique que la ligne a deux guillemets doubles avec entre 3 et 15 lignes non-continues entre les deux. Une chaîne composée de rien mais de 10 guillemets doubles correspondra aux deux modèles, mais ne correspond pas au critère.