2

私は単純に各数値を取り出し、それらを合計して合計を得ようとしています。

入力ファイル:

Samsung   46
RIM       16
Apple     87
Microsoft 30

私のコードはコンパイルされますが、0 しか返されません。

open (UNITS, 'units.txt') || die "Can't open it $!";
my @lines = <UNITS>;
my $total = 0;
while (<UNITS>) {
    chomp;
    my $line = pop @lines;
    $line += $total;
}
print $total;
4

4 に答える 4

5

whileとにかく.でそれらをループするだけなら、すべての行を配列に丸呑みする必要はありません splitまた、番号を取得するには各行が必要です。

use warnings;
use strict;

open (UNITS, 'units.txt') || die "Can't open it $!";
my $total = 0;
while (<UNITS>) {
    chomp;
    my $num = (split)[1];
    $total += $num;
}
print "$total\n";

__END__

179
于 2013-11-13T18:50:04.797 に答える
5

ここには3つの問題があります

  • 次のような文字列を追加しようとしています'Samsung 46' + 'RIM 16'

  • ファイル全体を読み込んでから、ループ内@linesのファイルからさらに読み込もうとします。whileすでにファイルの最後まで読み取っているため、そのループには決して入りません

  • その逆ではなく、ループ内$totalの(宣言されていない)変数に追加しています。$lineだから$totalゼロのままで、それに$lineゼロを加え続けます

whileレコードへの順次アクセス以外の何かが必要でない限り、ファイルを読み取るために使用するのが最善です。そのため、削除すること@linesから始めます。

レコードのどの部分を蓄積したいかは完全には明らかではありません。このプログラムは空白で行を分割し、各行の最後のフィールドを一緒に追加します。

すべてのプログラムの開始時に常に 行う必要がuse strictあります。use warningsこれは、コード内のバグを見つけやすくする手段です。また、使用したグローバル ファイル ハンドルと、3 パラメータ形式のopen.

use strict;
use warnings;

open my $units, '<', 'units.txt' or die "Can't open it: $!";

my $total;

while (<$units>) {
  my @fields = split;
  $total += $fields[-1];
}
print $total;

出力

179
于 2013-11-13T18:53:59.083 に答える
2
use strict;
use warnings;
open my $fh, "<", "units.txt" or die "well...";

my $total = 0;
while(<$fh>){
chomp;
my ($string, $num) = split(" ", $_);
$total += $num;
}
print $total;
于 2013-11-13T18:50:47.160 に答える