【发布时间】:2016-03-13 17:00:23
【问题描述】:
我有一个在所有文件中添加所有向量的代码。 可以有任意数量的输入文件。例如第一个输入文件是:
0.55 0 0.3335 1.2
0.212 0 2.2025 1
第二个是:
0.25 0 0.3333 1.0
0.1235 0 0.2454 1
我得到的是所有向量的总和,因此我得到一个向量 也就是:
1.13550 0 3.1147 4.2
但我试图将第一个文件的第一个向量与第二个文件的第一个向量相加,依此类推。结果根据这个例子,我应该得到 2 个向量。
现在我有这个:
use strict;
use warnings;
if ($ARGV[0] ne "vector1.dat"){
die ("vector1.dat is necessary as first argument");
}
my @sum = 0;
my $dim = 0;
while (<>) {
#Ignore blank lines, hashtags
#and lines starting with $
if ($_ =~ /#/ || $_ =~ /^$/ || $_ =~ /^\s$/){
next;
}
my @vectors = split(" ", $_);
my $vector_length = @vectors;
if ($dim eq 0) {
$dim = $vector_length;
}
else {
if ($dim ne $vector_length) {
die ("Vector dimensions do not match. : $!");
}
}
for (my $i = 0; $i <= $#vectors; $i++) {
$sum[$i] += $vectors[$i];
}
}
$" = "\t\t";
print "\n --- \n @sum \n";
我需要的只是找出如何识别每个文件的第 n 行 并在记住这些行的列值时求和,可以有 n 个文件。 我在这里看到了类似问题的文件处理问题,但是 我没有在那里找到我的答案。 只是寻找一些建议和指导。卡在这上面了。
【问题讨论】:
-
你应该在 shebang 线上
use warnings 'all'而不是-w。不要同时使用两者 -
my @sum = 0?那应该是什么意思?第一个元素为 0 的数组? -
如果您打算
/^$/检查以美元符号$开头的行,那将不起作用,因为$是一个正则表达式元字符。您在下一个正则表达式中偶然显示。 -
@briandfoy 不,这将是第三个寻找空行的正则表达式。
/^\s$/。他在 cmets 中说它是“以 $ 开头的行”。 -
感谢您对 shebang 的建议,我会记住这一点。关于@sum-好点,绝对没有必要。我会记住,有更好的方法来查找空行,谢谢你的通知。
标签: perl vector sum filehandle