Разделить и добавить цифры - PullRequest
4 голосов
/ 03 февраля 2012

Если я открою файл со строками, такими как «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 ]

8 голосов
/ 03 февраля 2012
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 & mdash; Всегда используйте use strict; use warnings;. Он обнаружил бы ваше неправильное использование запятых в qw, и он бы исключил ваше неправильное использование undef для первого аргумента split.

2 голосов
/ 03 февраля 2012

Никто не предложил eval решение?

my @strings = qw( 12243434 345 676744 );
foreach my $string (@strings) {
    my $sum = eval join '+',split //, $string;
    print "$sum\n";
}
2 голосов
/ 03 февраля 2012
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";
1 голос
/ 03 февраля 2012

Если ваши номера находятся в файле, однострочник может быть хорошим:

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(<>) цикл вокруг программы - откройте имя файла, указанное в качестве аргумента, и прочитайте каждую строку в $_.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...