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

问题描述 投票:0回答:1

我的代码是这样的。

#!/usr/bin/perl
$counter=0;
@list=<STDIN>;
chomp(@list);
if (@list==~ /^[+-]?\d+$/ )
{
$counter++;
}
print $counter;

所以我把数据写成这样: A B C D 1 2然后它应该打印 2

因为 1,2

但不管我把什么数据写到列表中,我都会得到以下结果 0.那么,我的问题是什么呢?if?

regex perl if-statement numbers int
1个回答
2
投票

始终 use strict; use warnings;. 如果你的目标是计算列表中数字元素的数量,你可以使用 grep 来过滤列表元素,然后应用 scalar 来获取其长度(或使用 $length 而不是直接将过滤后的列表存储在 @matches):

#!/usr/bin/perl

use strict;
use warnings;

my @list = <STDIN>;
chomp(@list);
my @matches = grep /^[+-]?\d+$/, @list;
print scalar @matches . "\n";

样品运行。

$ ./count.pl
-62
a
b
4
c
+91023
d
3

0
投票

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

你的主要问题都在这一行。

if (@list==~ /^[+-]?\d+$/ )

这里有两个很大的问题 首先,这里的 @list. 匹配运算符(=~)每次只作用于一个字符串。所以你需要在一个标量值上使用它。如果你给它一个数组 (就像你在这里做的那样),那么 Perl 将会 (默默地) 把数组作为一个标量值来计算 -- 这意味着你将得到数组中的元素数量,而不是数组中的内容 -- 这将是一个整数,所以你的 regex 总是匹配的。

但是,你说,它不匹配。是的,我意识到了。这就是你的第二个错误--你的匹配操作符错了。操作符是 =~ 而你使用的是 ==~ 额外 =). 你会希望这样的错误导致语法错误,但你不小心用了一个语法上有效的版本,但就是做不到你想要的。Perl 将你的代码解释为

if (@list = =~ /^[+-]?\d+$/ )

注意我加的空格 两者之间的那个 = 字符是很重要的。这是说 "执行匹配操作,并将结果分配给 @list". 但是,匹配操作符的匹配对象是什么呢?好吧,它还没有被赋予一个明确的变量来匹配,在这种情况下,它就会与默认变量匹配。$_. 你还没有投入任何东西 $_ 所以比赛失败。

在这一点上,我应该指出,如果你有 use warnings 的代码中,那么你就会收到各种有用的警告,说明你做错了什么。所有的Perl程序员(包括最有经验的程序员)都应该始终拥有 use strictuse warnings 在他们的代码中。

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

@list = <STDIN>;

你没有说清楚,但我怀疑你在一行中输入了所有的列表。在这种情况下,你不想把你的输入存储在一个数组中;你应该把它存储在一个标量中。

chomp($list = <STDIN>);

然后,你可以通过使用 split().

@list = split /\s+/, $list;

然后你可以使用 grep.

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

当评估为标量时。grep 返回该代码块为真的次数。

把这些放在一起(并添加 strictwarnings)我们得到了下面的内容。

#!/usr/bin/perl

use strict;
use warnings;

chomp(my $list = <STDIN>);

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

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

© www.soinside.com 2019 - 2024. All rights reserved.