2012-12-03 91 views
1

我有一個Perl問題,應該相當容易,但看起來不太正確我有一個包含2列數字的文件,我需要的是採取第二列,並將第一列中的第一個值添加到第二個,第二個到第三個第三個到第四個等等。我不知道第2列有多少個數字,所以我需要這樣做直到文件結束,我也希望能夠在我的程序中進一步使用這些值。我將在下面給出一個虛擬示例以及我迄今爲止嘗試的代碼。Perl將值1添加到值2值2將值3等值添加到文件末尾

實例文件製表符分隔的文件data.txt中的所需出

1 29 
2 26 
3 24 
4 28 

實施例放

55 

50 

52 

代碼爲是:

#!/usr/bin/perl -w 
# use and library files 
use strict; 
use warnings; 


my $line; 
my $Val; 
my $sum; 
open(FH, "data.txt") or die $!; 
while (my $line = <FH>){ 
my @val = split("\t", $line); 
my $Val = $val[1]; 
my $sum = $Val+$Val; 
print "$sum\n"; 
} 
close FH; 

行$總和= $纈氨酸+ $瓦爾;需要有一些循環,所以正確的值被添加,但不知道如何得到它的權利,然後我需要以某種方式分配總和值變量名稱以後使用。

任何幫助,將不勝感激

在此先感謝 西尼德

回答

3

你得到了它幾乎在你的榜樣。 $Val是您以前的價值。所以在使用$ sum之前,你不能覆蓋它。這意味着交換這兩行並添加前一個和當前值。

my $sum = $Val+$val[1]; 
my $Val = $val[1]; 

一個建議,嘗試給變量賦予不同的名稱。情況差異很容易導致混淆。

這裏是我的版本

my $prev = 0; 
while (<>) { 
    my(@cols) = split; 
    my $sum = $prev + $cols[1]; 
    $prev = $cols[1]; 
    print "$sum\n" if ($. > 1); # skip first line 
} 

perl sum.pl data.txt 
+0

非常感謝,這是完美的。我以爲我很親密。 :) – sinead

+0

@sinead如果這解決了你的問題,考慮[接受](http://meta.stackexchange.com/a/5235)我的答案或TLP的答案。謝謝。 –

1

這可以很容易用一行代碼來完成調用它:

perl -lanwe 'push @a, $F[1]; 
      next if @a < 2; print $a[0]+$a[1]; shift @a;" nums.csv 

輸出:

55 
50 
52 

說明:

這是一個班輪的deparsed代碼:

while (<>) {    # comes from the -n switch 
    chomp;    # remove line ending, -l switch does this 
    our(@F) = split;  # split the input line, -a switch does this 
    push @a, $F[1];  # buffer the second field 
    next if @a < 2;  # check buffer size 
    print $a[0] + $a[1]; # print sum 
    shift @a;    # remove first value from buffer 
} 

總結:

  • -l處理您的行結束你
  • -a在空白處自動拼寫輸入行。您可以使用-F開關自己提供分割圖案。 -F"\t"
  • -n在您的代碼中放置了一個while(<>)循環。這有效地將參數作爲文件名並循環遍歷文件內容。
  • -w啓用警告,這是一件好事。
+0

謝謝Explination是好的,現在我按照它 – sinead

+0

不客氣。 – TLP