2012-02-02 3 views
4

Если я открою файл со строками типа «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"; 
} 

Но я не знаю, с чего начать для фактической функции добавления.

ответ

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.

+0

+1 Для указания 'qw()' ',' error. – dgw

+0

Большое спасибо за ошибку и помощь. –

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"; 
+0

хороший ответ, [функция карты] (http://perldoc.perl.org/functions/map.html). –

+0

Разве вы не добавляете цифры каждого заданного числа, а не только из последнего? – dgw

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

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

my @strings = qw(12243434 345 676744); 
foreach my $string (@strings) { 
    my $sum = eval join '+',split //, $string; 
    print "$sum\n"; 
} 
Смежные вопросы