배열의 크기를 찾는 여러 가지 방법을 찾은 것 같습니다. 이 세 가지 방법의 차이점은 무엇입니까?
my @arr = (2);
print scalar @arr; # First way to print array size
print $#arr; # Second way to print array size
my $arrSize = @arr;
print $arrSize; # Third way to print array size
답변
첫 번째와 세 번째 방법은 동일합니다. 스칼라 컨텍스트에서 배열을 평가합니다. 이것을 배열의 크기를 얻는 표준 방법이라고 생각합니다.
두 번째 방법은 실제로 배열의 마지막 인덱스를 반환하는데, 이는 일반적으로 배열 크기와 동일하지 않습니다.
답변
첫째, 두 번째는 다른 두 가지와 동일하지 않습니다. $#array
배열의 마지막 인덱스를 반환합니다. 배열의 크기보다 1이 작습니다.
다른 두 개는 사실상 동일합니다. 스칼라 컨텍스트를 만들기 위해 단순히 두 가지 방법을 사용하고 있습니다. 가독성 문제로 귀결됩니다.
나는 개인적으로 다음을 선호합니다.
say 0+@array; # Represent @array as a number
나는 그것을보다 명확하게 발견
say scalar(@array); # Represent @array as a scalar
과
my $size = @array;
say $size;
후자는 이것처럼 매우 분명해 보이지만 다른 코드의 일부 인 경우 여분의 줄이 선명도에서 벗어납니다. @array
스칼라 컨텍스트에서 수행 하는 작업을 가르치 $size
거나 두 번 이상 사용하려는 경우 유용합니다 .
답변
이것은 배열을 스칼라 컨텍스트로 만들어서 크기를 계산하여 크기를 얻습니다.
print scalar @arr;
이것은 스칼라 변수에 할당되기 때문에 배열을 스칼라 컨텍스트로 만드는 또 다른 방법입니다.
my $arrSize = @arr;
이것은 배열에서 마지막 요소의 색인을 얻습니다. 실제로 크기에서 1을 뺀 값입니다 (색인이 0에서 시작한다고 가정하면 펄에서 조정할 수 있지만 일반적으로 나쁜 생각입니다).
print $#arr;
이 마지막 것은 배열 크기를 얻는 데 사용하기에 좋지 않습니다. 배열의 마지막 요소를 얻으려는 경우 유용합니다.
my $lastElement = $arr[$#arr];
또한 스택 오버플로에서 볼 수 있듯이이 구문은 대부분의 구문 강조 표시기에서 올바르게 처리되지 않습니다 …
답변
두 번째 방법을 사용하려면 1을 추가하십시오.
print $#arr + 1; # Second way to print array size
답변
두 번째를 약간 수정하면 세 가지 모두 동일한 결과를 제공합니다.
my @arr = (2, 4, 8, 10);
print "First result:\n";
print scalar @arr;
print "\n\nSecond result:\n";
print $#arr + 1; # Shift numeration with +1 as it shows last index that starts with 0.
print "\n\nThird result:\n";
my $arrSize = @arr;
print $arrSize;
답변
예:
my @a = (undef, undef);
my $size = @a;
warn "Size: " . $#a; # Size: 1. It's not the size
warn "Size: " . $size; # Size: 2
답변
“펄 변수 유형”섹션 의 perlintro 설명서 포함
특수 변수
$#array
는 배열의 마지막 요소의 인덱스를 알려줍니다.print $mixed[$#mixed]; # last element, prints 1.23
$#array + 1
배열에 몇 개의 항목이 있는지 알려 주려고 할 수 있습니다 . 귀찮게하지 마십시오. 이와 같이@array
Perl이 스칼라 값을 찾을 것으로 예상되는 위치 ( “스칼라 컨텍스트에서”)를 사용하면 배열의 요소 수를 얻을 수 있습니다.if (@animals < 5) { ... }
perldata 문서는 또한이를 커버 “스칼라 값”섹션 .
스칼라 컨텍스트에서 배열을 평가하면 배열의 길이가 반환됩니다. C 쉼표 연산자와 같이 마지막 값을 반환하는 목록이나 반환하려는 느낌을 반환하는 내장 함수는 목록에 해당되지 않습니다. 다음은 항상 사실입니다.
scalar(@whatever) == $#whatever + 1;
일부 프로그래머는 의심 할 여지가 없도록 명시 적 변환을 사용하도록 선택합니다.
$element_count = scalar(@whatever);
같은 섹션의 앞부분에서 배열의 마지막 요소의 인덱스를 얻는 방법을 설명합니다.
배열의 길이는 스칼라 값입니다. 에서처럼을
@days
평가 하여 배열의 길이를 찾을 수 있습니다 . 그러나 이것은 배열의 길이가 아닙니다. 마지막 요소의 첨자이며 일반적으로 0 번째 요소가 있기 때문에 다른 값입니다.$#days
csh