Regex 如何知道我的列表中是否有数字?

Regex 如何知道我的列表中是否有数字?,regex,perl,if-statement,numbers,int,Regex,Perl,If Statement,Numbers,Int,我的代码如下所示: #!/usr/bin/perl $counter=0; @list=<STDIN>; chomp(@list); if (@list==~ /^[+-]?\d+$/ ) { $counter++; } print $counter; #/usr/bin/perl $counter=0; @列表=; chomp(@list); 如果(@list=~/^[+-]?\d+$/) { $counter++; } 打印$counter; 所以我写了如下数据:abcd12

我的代码如下所示:

#!/usr/bin/perl
$counter=0;
@list=<STDIN>;
chomp(@list);
if (@list==~ /^[+-]?\d+$/ )
{
$counter++;
}
print $counter;
#/usr/bin/perl
$counter=0;
@列表=;
chomp(@list);
如果(@list=~/^[+-]?\d+$/)
{
$counter++;
}
打印$counter;
所以我写了如下数据:abcd12 然后它应该打印
2

因为1,2

但无论我在列表中写入什么数据,我都会返回
0
。 那么我的
如果
有什么问题呢?

总是
严格使用;使用警告。如果您的目标是计算列表中数字元素的数量,则可以使用
grep
过滤列表元素,然后应用
scalar
获取其长度(或直接使用
$length
而不是将过滤后的列表存储在
@matches
中):


老实说,看起来你刚刚猜到了这个语法。这并不是编写程序的好方法:-)

您的主要问题在这一行:

if (@list==~ /^[+-]?\d+$/ )
这里有两个相当大的问题。首先是
@列表
。匹配运算符(
=~
)一次处理单个字符串。所以需要对标量值使用它。如果您给它一个数组(正如您在这里所做的那样),那么Perl将(静默地)将数组作为标量进行计算——这意味着,您将得到数组中的元素数,而不是数组的内容——这将是一个整数,这样您的正则表达式将始终匹配

但是,你说,它不匹配。是的,我知道。这就是你的第二个错误——你的匹配操作符错了。操作符是
=~
,您正在使用
=~
(请参阅额外的
=
)。您可能希望这样的错误会导致语法错误,但您无意中使用了一个语法有效的版本,但它并不是您想要的。Perl将代码解释为:

if (@list = =~ /^[+-]?\d+$/ )
注意我添加的空格。两个
=
字符之间的字符很重要。这表示“执行匹配操作并将结果分配给
@list
”。但是匹配操作符匹配的是什么?嗯,没有给它一个显式的变量来匹配,在这种情况下,它匹配默认变量,
$\uu
。您没有在
$中输入任何内容,因此匹配失败

在这一点上,我应该指出,如果您的代码中有
使用警告
,那么您将得到关于您做错了什么的各种有用警告。所有Perl程序员(包括最有经验的程序员)的代码中都应该有
use strict
use warnings

这里还有另一个困惑点。这是你阅读输入的方式

@list = <STDIN>;
然后,您可以使用
grep
获取数组中的数字计数

my $count = grep { /^[-+]\d+$/ } @list;
当作为标量计算时,
grep
返回代码块为真的次数

将它们放在一起(并添加
严格
警告
),我们得到以下结果:

#!/usr/bin/perl

use strict;
use warnings;

chomp(my $list = <STDIN>);

my $count = grep { /^[-+]\d+$/ } split /\s+/, $list;
#/usr/bin/perl
严格使用;
使用警告;
chomp(我的$list=);
my$count=grep{/^[-+]\d+$/}split/\s+/,$list;

至少在我看来,这比你的版本要简单。

谢谢,它奏效了!还有一个问题要问你:我怎么知道句子中是否有数字?我今年两岁。然后它会打印“1”。@MTn:如果你有一个新问题,请把它放在一个新的帖子里(但是先停下来想一想!)是的,新问题应该在他们自己的帖子里,但只需
$句子=~/\d+/
应该这样做。另请参见和中的
$RE{num}
@list = split /\s+/, $list;
my $count = grep { /^[-+]\d+$/ } @list;
#!/usr/bin/perl

use strict;
use warnings;

chomp(my $list = <STDIN>);

my $count = grep { /^[-+]\d+$/ } split /\s+/, $list;