即使有非数字字符,如何在STDIN中找到所有数字的总和?

时间:2014-05-13 23:06:26

标签: perl

我有一个作业要求我输入一个数字和字符序列,每个数字和字符用空格分隔,然后通过输入" q"结束序列。或" Q"然后是一个空间。除了数字之外的所有东西都应该被丢弃,我们要找到总和。因此,例如,如果输入是" 1 12 a 2 5 P Q"然后我们应该期望得到" 20"作为输出。

到目前为止,我正在使用

$input = <>;
$input =~ tr/0-9//cd;

只获取数字,但我想要的是将它们分开并得到总和。现在输出将是11225,我想要&#34; 1 + 12 + 2 + 5&#34;得到总和。

3 个答案:

答案 0 :(得分:1)

perl -ne '$s=0;($line)=/(.*?)[Qq]/;while($line=~/(\d+)/g) {$s+=$1} print "$s\n"'

<强>解释

以Q或q开始剥离每一行的尾部,然后扫描剩余部分以查找孤立的正整数并将它们加在一起。

答案 1 :(得分:0)

首先,删除所有不是数字或空格的字符:

$input =~ s/[^0-9\s]//g;

然后,拆分空白:

@digits = split(/\s/, $input);

然后你有一个可以加起来的数字列表。

答案 2 :(得分:0)

在第一步中保留空格:

$input =~ tr/0-9 //cd;

然后拆分空格:

my @numbers = split ' ', $input;

(这是一种特殊形式的分割,其作用类似于split /\s+/,但也会丢弃空的前导字段。)

你可能想在Q之后摆脱一切:

$input =~ s/Q .*//i;

为了它的价值,我不会跳到这里使用tr;我已经开始拆分空格,然后处理只有数字的字段,直到达到Q.