使用Perl验证电话号码

时间:2019-02-25 08:23:38

标签: perl

我要在以下条件下验证电话号码:

  1. 长度应为10位数字
  2. 应以7或8或9开头

如果它不满足这些要求,我们应该将该号码弄错。

我尝试了以下方法:

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

2 个答案:

答案 0 :(得分:3)

可能值得解释一下原始版本出了什么问题。你有两张支票。第一个(length($name)==10)很好。问题出在第二个。

$name==~  m{/[^7-9]/}

这里有三个问题。首先,您使用了错误的运算符。您知道需要将变量($name绑定到匹配运算符,但是绑定运算符是=~而不是==~。但是,不幸的是,您的运算符没有足够大的错误来引发语法错误。 Perl会将其解释为数值比较(==),然后是按位取反(~)。那当然不是你想要的!

您的第二个问题是匹配运算符。看起来您知道match运算符是m/.../,并且您还知道可以为match运算符选择其他定界符-您选择了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切换为$name。您也可以考虑修改变量名。import React, { PropTypes, Component } from 'react'; import { BottomNavigation, Text } from 'react-native-paper'; import Previousmatches from './Tabbarfiles/Previousmatches'; import Upcomingmatches from './Tabbarfiles/Upcomingmatches'; import Yourscore from './Tabbarfiles/Yourscore'; import { StyleSheet, Platform, StatusBar, View,Dimensions } from 'react-native'; import { Container, Header, Left, Body, Right, Button, Icon, Tab, Tabs, ScrollableTab , Title , Footer, TabHeading, FooterTab, Content} from 'native-base'; import { TabViewAnimated, TabViewPage, TabView} from 'react-native-tab-view'; export default class Home extends Component { state = { index: 0, routes: [ { key: 'music', title: 'Home', icon: 'queue-music' }, { key: 'albums', title: 'Points Table', icon: 'album' }, { key: 'recents', title: 'Create Scorecard', icon: 'history' }, ], }; _handleIndexChange = index => this.setState({ index }); _renderScene = BottomNavigation.SceneMap({ music: Previousmatches, albums: Upcomingmatches, recents: Yourscore, }); render() { return ( <Container style={styles.container}> <Header hasTabs style={styles.header}> <Left> <Button transparent onPress={() => this.props.navigation.navigate("DrawerOpen")}> <Icon name='menu' /> </Button> </Left> <Body> <Title>PALMS</Title> </Body> <Right /> </Header> <Tabs locked tabContainerStyle={{height: 45}}> <Tab heading={ <TabHeading><Text style={styles.tabTextStyle}>PREVIOUS MATCHES</Text></TabHeading>}> <Previousmatches /> </Tab> <Tab heading={ <TabHeading><Text style={styles.tabTextStyle}>UPCOMING MATCHES</Text></TabHeading>}> <Upcomingmatches /> </Tab> <Tab heading={ <TabHeading><Text style={styles.tabTextStyle}>YOUR SCORE</Text></TabHeading>}> <Yourscore /> </Tab> </Tabs> <BottomNavigation style={{height: '100%'}} navigationState={this.state} onIndexChange={this._handleIndexChange} renderScene={this._renderScene} /> </Container> ); } }; const styles = StyleSheet.create({ textStyle : { fontSize: 9 }, container: { flex: 1, height: '100%', ...Platform.select({ android: { // marginTop: StatusBar.currentHeight, } }) }, header:{ ...Platform.select({ android: { height: 40 } }), backgroundColor: 'rgba(81, 133, 237, 1.0)' }, tabBarStyle : { height: 50 }, tabTextStyle : { fontSize: 10, alignContent: 'center', color:'white' // justifyContent: 'center' }, }) 不是包含电话号码的变量的好名字!)

答案 1 :(得分:1)

我只在这里使用一个正则表达式:

^[789][0-9]{9}$

这避免了将验证逻辑分散到几个地方。

if ($name =~ m{/^[789][0-9]{9}$/}){
    print "$name is valid \n";
}
else {
    print "$name is not valid \n";
}