我想在以下条件下验证电话号码:长度应为10位数应该以7或8或9开头如果它不符合这些要求,我们应该通过这个数字。
我试过了 …
可能值得解释原始版本的错误。你有两张支票。第一个 ( length($name)==10 )很好。问题出在第二个问题上。
length($name)==10
$name==~ m{/[^7-9]/}
这里有三个问题。首先,您使用的是错误的运算符。你知道你需要绑定你的变量( $name )到匹配运算符,但绑定运算符是 =~ 不 ==~ 。但是,遗憾的是,您的运算符没有错误,导致语法错误。 Perl会将其解释为数字比较( == )然后是按位否定( ~ )。那肯定不是你想要的!
$name
=~
==~
==
~
你的第二个问题是匹配运算符。看起来你知道匹配运算符是 m/.../ 而且你也知道你可以为匹配算子选择一个替代定界符 - 你选择了 m{...} 。但你不应该嵌套这些分隔符。当你使用 m{/.../} 你正在寻找两个字面字符 / 在你的字符串中。
m/.../
m{...}
m{/.../}
/
最后,你的实际正则表达式存在问题。您希望字符串以7,8或9开头。将这些数字放在字符类中( [7-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 因为优先级较低。您也可以考虑修改变量名称。 $name 对于包含电话号码的变量来说,它不是一个好名字!)
&&
and
我只想在这里使用一个正则表达式:
^[789][0-9]{9}$
这避免了必须在几个地方传播验证逻辑。
if ($name =~ m{/^[789][0-9]{9}$/}){ print "$name is valid \n"; } else { print "$name is not valid \n"; }