我想用以下条件验证电话号码:
如果它不符合这些要求,我们就不能满足这个数字。
我尝试了以下几点:
print "Enter phone number: \n";
$name=<>;
chomp $name;
if (length($name)==10 && $name==~ m{/[^7-9]/}){
print "$name is valid \n";
}
else {
print "$name is not valid \n";
}发布于 2019-02-25 08:25:53
我只需要用一个正则表达式:
^[789][0-9]{9}$这就避免了将验证逻辑分散到几个地方。
if ($name =~ m{/^[789][0-9]{9}$/}){
print "$name is valid \n";
}
else {
print "$name is not valid \n";
}发布于 2019-02-25 09:21:58
也许值得解释一下你原来的版本到底出了什么问题。你有两张支票。第一个(length($name)==10)很好。问题在于第二个问题。
$name==~ m{/^7-9/}
这里有三个问题。首先,你用错了接线员。您知道需要将变量($name)绑定到匹配运算符,但绑定运算符是=~而不是==~。但是,不幸的是,您的操作符没有错误到抛出语法错误。Perl将将其解释为一个数字比较(==),然后是按位否定(~)。这肯定不是你想要的!
第二个问题是匹配操作符。看起来,您知道匹配运算符是m/.../,并且您也知道可以为匹配运算符选择另一个分隔符--您已经选择了m{...}。但你不应该嵌套那些分隔符。当您使用m{/.../}时,您正在查找字符串中的两个文字字符/。
最后,您的实际正则表达式有一个问题。您希望字符串以7、8或9开头。将这些数字放入字符类([7-9])是个好主意。但是,您也不应该将字符串锚(^)的开始放在字符类中。在字符类的开头,^有一个不同的含义--意思是“这里列出的字符中没有一个”。所以你的角色类最终意味着与你想要的完全相反的意思。
您的匹配表达式应该如下所示:
$name =~ m{^[7-9]}编写完整的代码:
print "Enter phone number: \n";
$name = <>;
chomp $name;
if (length($name) == 10 and $name =~ m{^[7-9]}) {
print "$name is valid \n";
}
else {
print "$name is not valid \n";
}(我做了一些整理工作-在运营商周围添加一些空格,并将&&转换为and,因为is的优先级较低。)您还可以考虑修改变量名。$name不是一个包含电话号码的变量的很好的名称!)
https://stackoverflow.com/questions/54862088
复制相似问题