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;