【问题标题】:How do I know if there is a number in my list?我如何知道我的列表中是否有数字?
【发布时间】:2020-08-18 00:03:45
【问题描述】:

我的代码如下所示:

#!/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】:

总是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

【讨论】:

  • 感谢它的工作!再问你一个问题:我怎么知道句子中是否有数字?例如:我今年 2 岁。然后它会打印'"1"'。
  • @MTn:如果您有新问题,请在新帖子中提出(但请先停下来考虑一下!)
  • 是的,新问题应该在他们自己的线程中,但只有$sentence =~ /\d+/; 应该这样做。
【解决方案2】:

老实说,您似乎只是猜到了这种语法。这不是编写程序的好方法:-)

你的主要问题在这一行:

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

这里有两个相当大的问题。首先是@list。匹配运算符 (=~) 一次处理一个字符串。所以你需要在一个标量值上使用它。如果你给它一个数组(就像你在这里所做的那样),那么 Perl 将(默默地)将数组评估为一个标量 - 这意味着你将获得数组中元素的数量,而不是获取数组的内容- 这将是一个整数,因此您的正则表达式将始终匹配。

但是,你说,它不匹配。是的,我意识到这一点。这取决于您的第二个错误-您的匹配运算符错误。运营商是=~,而您正在使用==~(请参阅额外的=)。您可能希望这样的错误会导致语法错误,但您不小心使用了一个在语法上有效但并没有达到您想要的效果的版本。 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;

至少在我看来,它看起来比你的版本简单。

【讨论】:

    猜你喜欢
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 2020-12-24
    相关资源
    最近更新 更多