如果我打开一个包含“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";
}
但我不知道从哪里开始实际添加功能。
答案 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(<>)
循环程序 - 打开作为参数给出的文件名,并将每行读入$_
。