[perl] Perl에서 배열의 크기를 구합니다

배열의 크기를 찾는 여러 가지 방법을 찾은 것 같습니다. 이 세 가지 방법의 차이점은 무엇입니까?

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배열에 몇 개의 항목이 있는지 알려 주려고 할 수 있습니다 . 귀찮게하지 마십시오. 이와 같이 @arrayPerl이 스칼라 값을 찾을 것으로 예상되는 위치 ( “스칼라 컨텍스트에서”)를 사용하면 배열의 요소 수를 얻을 수 있습니다.

if (@animals < 5) { ... }

perldata 문서는 또한이를 커버 “스칼라 값”섹션 .

스칼라 컨텍스트에서 배열을 평가하면 배열의 길이가 반환됩니다. C 쉼표 연산자와 같이 마지막 값을 반환하는 목록이나 반환하려는 느낌을 반환하는 내장 함수는 목록에 해당되지 않습니다. 다음은 항상 사실입니다.

scalar(@whatever) == $#whatever + 1;

일부 프로그래머는 의심 할 여지가 없도록 명시 적 변환을 사용하도록 선택합니다.

$element_count = scalar(@whatever);

같은 섹션의 앞부분에서 배열의 마지막 요소의 인덱스를 얻는 방법을 설명합니다.

배열의 길이는 스칼라 값입니다. 에서처럼을 @days평가 하여 배열의 길이를 찾을 수 있습니다 . 그러나 이것은 배열의 길이가 아닙니다. 마지막 요소의 첨자이며 일반적으로 0 번째 요소가 있기 때문에 다른 값입니다.$#dayscsh