2012-02-02 72 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()'',錯誤。 – dgw 2012-02-02 21:43:45

+0

非常感謝,對於錯誤點和幫助。 – 2012-02-02 21:49:43

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

很好的答案,[map function](http://perldoc.perl.org/functions/map.html)。 – 2012-02-02 21:22:16

+0

難道你不應該加上每個給定數字的數字,而不是隻加上最後一個數字的數字嗎? – dgw 2012-02-02 21:45:21

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"; 
}