【问题标题】:perl exact string matchperl 精确字符串匹配
【发布时间】:2013-02-05 03:42:28
【问题描述】:

我有以下 Perl 代码来提示用户回答是/否。如果用户输入的不是是/否,请继续提示。没有其他词是可以接受的。我不知道为什么这段代码不起作用。我测试了答案“noooooo”,我期待它再次提示,但它没有进入 while 循环。

谁能帮忙找出我的错误?

@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; }

【问题讨论】:

  • 使用File::Copy 复制文件。 use File::Copy qw(copy); copy($src, $dest) or die $!;
  • do { print ...; chomp ... } while condition; 怎么样。更好的是,p3rl.org/IO::Prompt
  • 你在用use warnings; use strict;吗?

标签: perl


【解决方案1】:

我将只使用字符串相等运算符 eq 而不是正则表达式。

if( $file_yes_no eq 'yes' ) ...

如果我希望它不区分大小写,我会先将 lc 转换为小写。

你的正则表达式的问题是它会很高兴地匹配任何字符串包含字母yes顺序。如果你愿意,你可以像这样匹配字符串的开头和结尾:

if ($file_yes_no =~ m/^yes$/i ) ...

但我个人更喜欢第一种选择。

哦,我错过了第一部分......嗯。同样的交易,如果您必须使用正则表达式。

m/^(yes|no)$/i

我更倾向于避免使用正则表达式

【讨论】:

  • 感谢您的回答。我尝试使用 ^ 和 $ 并且它有效。我尝试了“ne”而不是 !~ 但它没有用 - 当我回答“nooooo”时它仍然跳过......注意那里的 OR......这是正确的吗? while ($file_yes_no ne "yes" || $file_yes_no ne "no") {
  • 不,您应该使用&amp;&amp;。原因是它总是不是一回事,也不是另一回事。
【解决方案2】:

您应该使用以下 Perl 正则表达式仅匹配 yesno(不区分大小写):

m/^(yes|no)$/i

如果是,请使用:

m/^yes$/i

【讨论】:

  • 使用\A\z,而不是^$,否则你也会匹配其他字符串(例如"yes\n"
  • @ysth,这与来自STDIN 的单行匹配。不会出现多行输入。
【解决方案3】:

因为您使用的是正则表达式。您可以编写正则表达式来匹配字符串的开头或结尾......像这样:

while( $file_yes_no !~ /^(yes|no)$/ ) {

^$ 是字符串的开头和结尾。你也可以省略m

或者您可以直接检查值:

while( $file_yes_no ne "yes" and $file_yes_no ne "no" ) {

此外,您的系统命令中有错字,但我假设这只是在此处复制。你真的不应该为此分支到外壳。查看File::Copy,它为您提供copy 函数

【讨论】:

  • 你应该更加小心:"yesss!" =~ /^yes|no$/ 是真的。
猜你喜欢
  • 2021-10-18
  • 1970-01-01
  • 2022-11-26
  • 1970-01-01
相关资源
最近更新 更多