해시에 대한 수학 연산을 수행하기 위해 Perl 스크립트를 작성했습니다. 이 해시에는 아래 샘플에 지정된 값이 들어 있습니다. 아래 코드를 작성했습니다. foreach 루프를 사용하지 않고이 코드를 배열 값에 대해 별도로 실행하면 출력이 정상입니다. 그러나 배열 값에 foreach 루프를 사용하여이 작업을 실행하면 A의 값에 대한 합계는 좋지만 B에서 출력에 이전 값이 추가됩니다.foreach 루프에서 배열을 새로 고치는 방법은 무엇입니까?
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;
그래서, 나는 여기 두 가지 문제가 있습니다
1) 나는 각 foreach 루프 반복에서 배열 (@data)를 새로 고칠 수 있습니까?
2) 어떻게 배열 ref ($ ec)에 값을 추가하고 배열에 저장할 수 있습니까? 왜냐하면 다음 코드를 사용할 때 :
for $ec ($table{$h}{$et}) {
@count = map { sum(@{$_}) } @$ec;
$total = sum(@count);
}
결과는 @count와 $ total에 대해 동일한 값을 제공합니다.
의견을 보내주십시오.
사실 루프 안에서 'my @data;'라고 말하면됩니다. 매번 새로운 '@ data'가됩니다. – friedo
'my @data =();의'=()'은 의미가 없습니다. 'my'를 사용하여 배열을 만들면 비어 있습니다. 빈 목록을 지정하면 당신과 펄의 시간은 달라지지 않습니다. –