perl exact de la chaîne de match
J'ai suivantes code Perl pour demander à l'utilisateur de réponse oui/non. Si l'utilisateur entre autre chose que oui ou non, continuer à poser la question. Aucun autre mot n'est acceptable. Je ne sais pas pourquoi ce code ne fonctionne pas. J'ai testé avec la réponse "nooon" et je m'attendais à ce qu'il invite à nouveau, mais il n'entre pas dans la boucle while.
Quelqu'un peut-il aider à trouver mon erreur ici?
@files = A, B, C;
foreach $c (@files) {
if (-e $c ) {
print " $c already exists. Do you want to overwrite? (yes or no): ";
chomp ($file_yes_no = <STDIN>);
while ($file_yes_no !~ m/yes{1}|no{1}/i ) {
print "$c already exists. Do you want to overwrite? (yes or no): ";
chomp ($file_yes_no = <STDIN>);
}
if ($file_yes_no =~ m/yes/i ) {
if (system ("cp -f /home/old_path//home/new_path/== 0) {
print "$c successfully copied;
} else {
die "Error: Copy failed, Check the message above";
}
}
else { print "No files copied\n; }
- Utilisation
File::Copy
pour copier un fichier.use File::Copy qw(copy); copy($src, $dest) or die $!;
- que diriez -
do { print ...; chomp ... } while condition;
. mieux encore, p3rl.org/IO::Prompt - Êtes-vous à l'aide de
use warnings; use strict;
?
Vous devez vous connecter pour publier un commentaire.
Je voudrais juste utiliser la chaîne de caractères opérateur d'égalité
eq
au lieu d'une regex.Si je voulais qu'il soit insensible à la casse j'aimerais tout d'abord les convertir en minuscules, avec
lc
.Le problème avec votre regex est qu'il sera heureux de correspondre à n'importe quelle chaîne contenant les lettres
yes
de manière séquentielle. Si vous le souhaitez, vous pouvez faire correspondre le début et la fin de la chaîne comme ceci:Mais personnellement, je préfère la première option.
Oh, j'ai raté la première partie... Hmmmm. Même chose, si vous doit utiliser les regex.
Encore une fois, je serais plus enclin à éviter les regex
&&
. La raison étant qu'il toujours ne pas être une chose OU l'autre.Vous devez utiliser après une expression régulière Perl pour la mise en correspondance uniquement
yes
ouno
(insensible à la casse):Pour oui, utilisation:
\A
et\z
, pas^
et$
, ou vous correspondra autres chaînes (par exemple"yes\n"
)STDIN
. Multi-ligne d'entrée ne se produira pas.Parce que vous êtes à l'aide d'une expression régulière. Vous pouvez écrire l'expression régulière correspondant au début ou à la fin de la chaîne ... comme ceci:
La
^
et$
sont le début et la fin de la chaîne. Aussi, vous pouvez omettre lem
.Ou vous pouvez vérifier les valeurs explicitement:
Aussi, vous avez une faute de frappe dans votre système de commande, mais je suppose que c'était juste de le copier ici. Vous ne devriez vraiment pas de branche à un shell pour que. Regarder dans
File::Copy
qui vous donne uncopy
fonction"yesss!" =~ /^yes|no$/
est vrai.