我的代码是这样的。
#!/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
?
始终 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
老实说,看起来你只是猜到了这个语法。这并不是一个写程序的好方法:-)
你的主要问题都在这一行。
if (@list==~ /^[+-]?\d+$/ )
这里有两个很大的问题 首先,这里的 @list
. 匹配运算符(=~
)每次只作用于一个字符串。所以你需要在一个标量值上使用它。如果你给它一个数组 (就像你在这里做的那样),那么 Perl 将会 (默默地) 把数组作为一个标量值来计算 -- 这意味着你将得到数组中的元素数量,而不是数组中的内容 -- 这将是一个整数,所以你的 regex 总是匹配的。
但是,你说,它不匹配。是的,我意识到了。这就是你的第二个错误--你的匹配操作符错了。操作符是 =~
而你使用的是 ==~
额外 =
). 你会希望这样的错误导致语法错误,但你不小心用了一个语法上有效的版本,但就是做不到你想要的。Perl 将你的代码解释为
if (@list = =~ /^[+-]?\d+$/ )
注意我加的空格 两者之间的那个 =
字符是很重要的。这是说 "执行匹配操作,并将结果分配给 @list
". 但是,匹配操作符的匹配对象是什么呢?好吧,它还没有被赋予一个明确的变量来匹配,在这种情况下,它就会与默认变量匹配。$_
. 你还没有投入任何东西 $_
所以比赛失败。
在这一点上,我应该指出,如果你有 use warnings
的代码中,那么你就会收到各种有用的警告,说明你做错了什么。所有的Perl程序员(包括最有经验的程序员)都应该始终拥有 use strict
和 use warnings
在他们的代码中。
这里还有一个疑惑点。是你阅读输入的方式。
@list = <STDIN>;
你没有说清楚,但我怀疑你在一行中输入了所有的列表。在这种情况下,你不想把你的输入存储在一个数组中;你应该把它存储在一个标量中。
chomp($list = <STDIN>);
然后,你可以通过使用 split()
.
@list = split /\s+/, $list;
然后你可以使用 grep
.
my $count = grep { /^[-+]\d+$/ } @list;
当评估为标量时。grep
返回该代码块为真的次数。
把这些放在一起(并添加 strict
和 warnings
)我们得到了下面的内容。
#!/usr/bin/perl
use strict;
use warnings;
chomp(my $list = <STDIN>);
my $count = grep { /^[-+]\d+$/ } split /\s+/, $list;
至少在我看来,这比你的版本更简单。