很简单,我试图看一个字段是否有9位数而没有别的。
我的$ var = 123456789
( my $nine ) = ( $var =~ /\d{9}/ );
从我的理解中说,“匹配一个数字9次,没有别的”
这会输出1
,但不会输出我期待的123456789
。为什么呢?
答案 0 :(得分:1)
您的模式匹配字符串中任意位置的九个(国际)数字字符的序列。您看到的1
是 true 值,模式匹配返回以表示匹配成功。
如果您只想验证变量的内容正好九个ASCII数字,那么您应该写
if ( $var =~ /\A[0-9]{9}\z/ ) { ... }
或者,如果您有ASCII /a
修饰符可用(自14以来任何版本的Perl 5),那么您可以说
if ( $var =~ /\A\d{9}\z/a ) { ... }
答案 1 :(得分:0)
正则表达式中的列表上下文中没有任何内容返回,
所以默认是它将变量$nine
设置为标量结果
正则表达式函数调用。并且该函数调用在标量上下文中返回
比赛的数量。
如果您要将其更改为(my $nine) = ($var =~ /\d/g);
$ 9将包含9.
在数字周围添加捕获缓冲区。
即:
( my $nine ) = ( $var =~ /(\d{9})/ );
但是,即使您的作业语法有效, 它的常规写作是
my ($nine) = $var =~ /(\d{9})/;
答案 2 :(得分:-1)
你真的想要这个:
( my $nine ) = ( $var =~ /(\d{9})/ );
问题是=~
是比较运算符,表达式( $var =~ /\d{9}/ )
的结果为真(1)。在我的示例中添加括号使正则表达式捕获其匹配项,因此它返回123456789。