0

ハッシュに対していくつかの数学的操作を行う Perl スクリプトを作成しています。このハッシュには、以下のサンプルに示す値が含まれています。以下のコードを書きました。foreach ループを使用せずに配列値に対してこのコードを個別に実行すると、出力は問題ありません。しかし、配列値に対して foreach ループを使用してこれを実行すると、A の値の合計は良好ですが、B からの出力には前の値が追加されます。

Hash Sample:

$VAR1 = 'A';
$VAR2 = {
    '"x"' => [values],
    '"y"' => [values],
    and so on...
$VAR3 = 'B';
$VAR4 = {
        '"x"' => [values],
    '"y"' => [values],
    and so on...
$VARn....

コード:

#!/usr/bin/perl -w
use strict;
use List::Util qw(sum);

my @data;
my @count;
my $total;

my @array = ("A", "B", "C", "D");

foreach my $v (@array) {

        my %table = getV($v); #getV is a subroutine returing a hash. 
        for my $h (sort keys %table) {
                  for my $et (sort keys %{ $table{$h} } ) {
        for $ec ($table{$h}{$et}) {
                            push @data, $ec;
                            @count = map { sum(@{$_}) } @data;
                            $total = sum(@count);
                        }
           }
print "sum of $v is  $total\n";
}

問題はこの行にあると思います。以前のすべての値を保存しているため、次の foreach ループですべての値を追加します。

push @data, $ec;

したがって、ここに 2 つの問題があります。

1) foreach ループの反復ごとに配列 (@data) を更新するにはどうすればよいですか?

2) 配列 ref ($ec) に値を追加して配列に格納するにはどうすればよいですか? 次のコードを使用する場合:

for $ec ($table{$h}{$et}) {
    @count = map { sum(@{$_}) } @$ec;
    $total = sum(@count);
}

出力では、@count と $total に同じ値が返されます。

提案を教えてください。

4

2 に答える 2

4

私があなたを正しく理解していれば、コードを少し変更するだけです。@datafor ループの先頭に空の配列 ( ) を作成します。お役に立てれば。

        for my $h (sort keys %table) {
                  my @data;
于 2009-09-04T10:58:09.490 に答える
0

1)新しい空の配列で開始するループ本体の上部で@data配列を宣言します。または多分あなたは言っているつもり@data = @$ecではありませんpush @data, $ecか?

2)$ ecによって参照される配列に値を追加するには、次のように言いsum(@$ec)ます。地図は必要ありません。

データ構造が何であるか、またはそれを使って何をしようとしているのかは完全には明確ではありません。サンプルの%tableがどのように見えるか、そしてそれからどのような結果が期待できるかを確認するのに役立ちます。

于 2009-09-04T14:59:27.457 に答える