拆分并添加数字

时间:2012-02-02 21:17:41

标签: perl math

如果我打开一个包含“233445”等字符串的文件,我怎么能将该字符串拆分成数字“2 3 3 4 4 5”并将每一个字符串相互添加为“2 + 3 + 3等...”并打印出结果。

到目前为止我的代码看起来像这样:

use strict;

#open (FILE, '<', shift);
#my @strings = <FILE>;
@strings = qw(12243434, 345, 676744); ## or a contents of a file
foreach my $numbers (@strings) {
   my @done = split(undef, $numbers);
   print "@done\n";
}

但我不知道从哪里开始实际添加功能。

4 个答案:

答案 0 :(得分:8)

use strict;
use warnings;

my @strings = qw( 12243434 345 676744 );
for my $string (@strings) {
   my $sum;
   $sum += $_ for split(//, $string);
   print "$sum\n";
}

use strict;
use warnings;
use List::Util qw( sum );

my @strings = qw( 12243434 345 676744 );
for my $string (@strings) {
   my $sum = sum split(//, $string);
   print "$sum\n";
}

PS - 始终使用use strict; use warnings;。它会检测到您在qw中滥用逗号,并且会导致您undef误导split的第一个参数。

答案 1 :(得分:2)

use strict;
my @done;
#open (FILE, '<', shift);
#my @strings = <FILE>;
my @strings = qw(12243434, 345, 676744); ## or a contents of a file
foreach my $numbers (@strings) {
   @done = split(undef, $numbers);
   print "@done\n";
}   

my $tot;
map { $tot += $_} @done;
print $tot, "\n";

答案 2 :(得分:2)

没有人建议使用eval解决方案?

my @strings = qw( 12243434 345 676744 );
foreach my $string (@strings) {
    my $sum = eval join '+',split //, $string;
    print "$sum\n";
}

答案 3 :(得分:1)

如果您的号码在文件中,那么单行可能会很好:

perl -lnwe 'my $sum; s/(\d)/$sum += $1/eg; print $sum' numbers.txt

由于加法仅使用数字,因此忽略所有其他字符是安全的。因此,只需使用正则表达式提取它们并将它们相加。

TIMTOWTDI:

perl -MList::Util=sum -lnwe 'print sum(/\d/g);' numbers.txt
perl -lnwe 'my $a; $a+=$_ for /\d/g; print $a' numbers.txt

选项:

  • -l自动选择输入并向print
  • 添加换行符
  • -n隐式while(<>)循环程序 - 打开作为参数给出的文件名,并将每行读入$_