【问题标题】:Verifying user input in perl在 perl 中验证用户输入
【发布时间】:2019-08-05 03:10:18
【问题描述】:

我正在尝试制作一个程序,我需要验证用户输入是否应该是 ip 的前 2 段(例如 00.000 或 000.000 等,其中 0 可以是任何数字)但程序说输入正确,即使是 213.1532。

if ($user input =~ m/(\d){3}.(\d){3}|(\d){2}.(\d){2}|(\d).(\d)|(\d){3}.(\d){2}|(\d){3}.(\d)|(\d){2}.(\d){3}|(\d).(\d){3}|(\d){2}.(\d)|(\d).(\d){2}/) {
    print "it works"
}

【问题讨论】:

  • 点是正则表达式中的一个特殊字符,用于任何你必须用反斜杠转义它的字符。
  • @Jens 是正确的。 Perlmonks 有一个网站向您展示正确的正则表达式:perlmonks.org/?node_id=1148750
  • 我认为您还需要将正则表达式锚定到字符串的开头和字符串的结尾

标签: perl


【解决方案1】:

$user input 是语法错误。你是说$user_input吗?

. 是正则表达式中的特殊字符,匹配任何字符("\n" 除外(除非您使用 /s))。它需要转义为 \. 才能匹配字面意思。

您的正则表达式未锚定,因此它将匹配输入的任何子字符串。

没有必要在\d 周围加上括号。

整个事情可以简化很多:

if ($user_input =~ /\A\d{1,3}\.\d{1,3}\z/a) {
    print "it works\n";
}
  • \A 匹配字符串的开头。
  • \d 匹配一个数字; /a 标志确保它只匹配 ASCII 数字 (0-9)。
  • {1,3} 的意思是“在前一件事的 1 到 3 之间”。
  • \. 匹配文字点。
  • \z 匹配字符串的结尾。

(如果$user_input是readline操作的结果,别忘了事先chomp。)

【讨论】:

  • 谢谢!是的,我的意思是 user_input。
  • @Nevg 如果这个答案解决了您的问题,请考虑marking it as accepted。
猜你喜欢
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
相关资源
最近更新 更多