老实说,您似乎只是猜到了这种语法。这不是编写程序的好方法:-)
你的主要问题在这一行:
if (@list==~ /^[+-]?\d+$/ )
这里有两个相当大的问题。首先是@list。匹配运算符 (=~) 一次处理一个字符串。所以你需要在一个标量值上使用它。如果你给它一个数组(就像你在这里所做的那样),那么 Perl 将(默默地)将数组评估为一个标量 - 这意味着你将获得数组中元素的数量,而不是获取数组的内容- 这将是一个整数,因此您的正则表达式将始终匹配。
但是,你说,它不匹配。是的,我意识到这一点。这取决于您的第二个错误-您的匹配运算符错误。运营商是=~,而您正在使用==~(请参阅额外的=)。您可能希望这样的错误会导致语法错误,但您不小心使用了一个在语法上有效但并没有达到您想要的效果的版本。 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;
至少在我看来,它看起来比你的版本简单。