perldsc 문서의 '일반적인 실수'섹션을 이해하려고합니다. 그가 말할 때 전달하고자하는 것은 무엇입니까?perl의 데이터 구조 이해
배열 배열과 같은 것을 구성하는 데있어서 두 가지 가장 일반적인 실수는 실수로 요소의 수를 계산하거나 다른 메모리 위치를 반복적으로 참조하는 것입니다 . 여기에 단지 중첩 된 배열 대신 수를 얻는 경우입니다 : 내가 이해에서
for my $i (1..10) {
my @array = somefunc($i);
$AoA[$i] = @array; # WRONG!
}
그것이 반복 때이다 (1..10)의 첫 번째 값을 것입니다 1
my @array = somefunc(1);
이 함수는 정의되어 있지 않으므로 로직을 생성 할 것입니다.
sub somefunc {
my $a = shift;
print $a * $a;
}
이렇게 본질적 것이다 :
1 * 1
그 결과가 '1'입니다. 내 이해하는
내 @array은 다음과 같이 표시됩니다 (
$AoA[$i] = @array;
을 나는 $ AOA [$ 1] 익명의 배열이 있으리라 믿고있어 :
@array = ('1');
그리고 다음 줄이 할 것 그/그녀는 '내'로 선언하지 않았습니다.) btw) @array는이 익명 배열의 첫 번째 요소가 될 것입니다. 그리고 각 반복마다 '2'를 반복합니다. 잘못이 코드 저자의 요점은 무엇
$AoA[$i] = @array
: '4'하고 전달됩니다
somefunc(2);
. 무엇이 잘못 되었는가를 이해하려고 노력하고 있지만 더 중요한 것은 코드를 이해하려고하는 것입니다. 어떤 도움을 주시면 감사하겠습니다.
UPDATE
가 나는 이것이 내가 인쇄 및 덤퍼를 사용할 때, 나는 시각적으로 저자가 전달하려고하는 것을 볼 수 있기 때문에 일반적인 실수 인 이유를 이해 생각, 여기에 수정 된 코드입니다. perldoc을의 perldsc의 일반적인 실수 단락에서
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
for my $i (1..10) {
my @AoA;
my @array = somefunc($i);
print "The array is Dumper(@array)\n";
$AoA[$i] = @array; # WRONG!
print Dumper($AoA[$i]);
}
sub somefunc {
my $a = shift;
return $a * $a;
}
은, 그/그녀는 여기에
를 말한다 방금 대신 중첩 된 배열의 수를 얻는 경우이다 : 아래에있는
을 Dumper의 출력.
The array is Dumper(1)
$VAR1 = 1;
The array is Dumper(4)
$VAR1 = 1;
The array is Dumper(9)
$VAR1 = 1;
The array is Dumper(16)
$VAR1 = 1;
The array is Dumper(25)
$VAR1 = 1;
The array is Dumper(36)
$VAR1 = 1;
The array is Dumper(49)
$VAR1 = 1;
The array is Dumper(64)
$VAR1 = 1;
The array is Dumper(81)
$VAR1 = 1;
The array is Dumper(100)
$VAR1 = 1;
은 그래서 반복
$VAR1 = 1;
이 수와하지 중첩 된 배열입니다 있으리라 믿고있어.
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
for my $i (1..10) {
my @count;
my @array = somefunc($i);
print "The array is Dumper(@array)\n";
$count[$i] = scalar @array;
print Dumper($count[$i]);
}
sub somefunc {
my $a = shift;
return $a * $a;
}
그러나 문서가 어떻게 중첩 된 배열을 얻는 말하지 않았다
저자는 카운트가 내가 진정으로 원하는 경우 다음과 같이 코드를 다시 작성하는 것을 나타냅니다 않았다?
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
my @count;
my @new_array;
for my $i (1..10) {
#my @count;
my @array = somefunc($i);
push @new_array, [@array];
}
sub somefunc {
my $a = shift;
return $a * $a;
}
print Dumper(\@new_array);
다음과 같은 성명에서
$VAR1 = [
[
1
],
[
4
],
[
9
],
[
16
],
[
25
],
[
36
],
[
49
],
[
64
],
[
81
],
[
100
]
];
'print $ a * $ a'가 아닌'return $ a * $ a'라고 생각합니까? '$ AoA [$ i]'는 (@AoA)라는 정규 배열의 $ i 번째 요소를 가리킨다. 할당'$ AoA [$ i] = @ array'는 스칼라 문맥 안에 있으므로'@ array'는 배열의 길이로 평가 될 것입니다 –
Re "* @ array는이 무명 배열의 첫 번째 원소가됩니다 *", No 스칼라 문맥에서'@ array'는'@ array' 안에있는 원소의 수를 계산합니다. – ikegami
이 예제는'@AoA'의 요소 안에'@ array'를 어떻게 배치 하는지를 보여주기 위해 노력하고 있습니다. 그래서'sub somefunc {my $ i = shift; return ($ i * 2, $ i * 3); }'이 더 좋은 예가 될 것입니다. – ikegami