1

かなり簡単なはずの Perl の質問がありますが、正しく理解できないようです2 番目、2 番目から 3 番目、3 番目から 4 番目など。列 2 にいくつの数字が入るかわからないので、ファイルの最後までこれを行う必要があります。これらも使用できるようにしたいと考えています。私のプログラムではさらに価値があります。これまでに試したコードとともに、ダミーの例を以下に示します。

サンプルファイル タブ区切りファイル 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;

行 $sum = $Val+$Val; ある種のループが必要なので、正しい値が追加されますが、それを正しくする方法がわからないため、後で使用する合計値の変数名をどうにかして割り当てる必要があります。

どんな助けでも大歓迎です

よろしくお願いします

4

2 に答える 2

3

あなたはあなたの例でほとんどそれを手に入れました。$Valは以前の値です。したがって、$sum で使用する前に上書きしてはいけません。これは、これら 2 行を入れ替えて、以前の値と現在の値を追加することを意味します。

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

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
于 2012-12-03T16:02:32.603 に答える
1

これは、ワンライナーで簡単に実行できます。

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

出力:

55
50
52

説明:

これは、ワンライナーの逆解析コードです。

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警告を有効にします。これは良いことです。
于 2012-12-03T16:19:21.580 に答える