문제

다음은 배열에서 값이 발생하는 횟수를 계산하기위한 간단한 Perl입니다. 이것은 경고없이 실행됩니다.

use warnings;
use strict;

my @data = qw(1 1 2 3 4 5 5 5 9);
my %histogram;
foreach (@data)
{
    $histogram{$_}++;
}

루프 본체가 변경 될 때

$histogram{$_} = $histogram{$_} + 1;

Perl은 "언급되지 않은 값의 사용"에 대해 경고합니다.

후드 아래에서 무슨 일이 일어나고 있습니까? ++ 연산자에게 피연산자로 제공 될 때 값이 초기화되고 + 연산자와 초기화되지 않은 이유는 무엇입니까?

도움이 되었습니까?

해결책

+ 연산자는 양식을 왼쪽의 양식과 오른쪽의 양식을 평가 한 다음 둘의 합을 반환합니다. 해시 호출 평가에는 특별한 맥락이 표시되지 않습니다.

++ 운영자는 ++ 운영자와 관련하여 Perlop Manpage에서 인용하는 특별한 마법을 제공합니다.

"undef"는 항상 숫자로 취급되며, 특히 증가하기 전에 0으로 변경됩니다 (따라서 undef 값의 증가는 "undef"보다는 0을 반환합니다).

편집하다: 차이에 대해 자세히 설명하기 위해 ++는 제자리에 값을 변경하는 반면 +는 인수를 입력으로 가져옵니다. + +가 정의되지 않은 값을 볼 때, 일반적으로 무언가 잘못되었지만 ++의 경우 해시 조작 예는 매우 일반적입니다. 사용자는 매번 확인하고 초기화하는 대신 Undef를 0으로 취급하려고합니다. 따라서 이러한 연산자를 이런 식으로 취급하는 것이 합리적 인 것 같습니다.

다른 팁

Perl이 반드시 값을 초기화하는 것은 아니지만 항상 그들에 대해 경고하지는 않습니다. 항상 예외를 찾을 수 있기 때문에 규칙에 대해 생각하지 마십시오. 다음 버전의 Perl은 귀하의 경고를 바꿀 것입니다.

이 경우 Harleqin이 말했듯이 자동 인익 운영자는 특별한 경우가 있습니다.

특정 연산자는 왼쪽 또는 오페란드의 기본값이 의미가있는 상황에서 일반적으로 사용되기 때문에 편의를 위해 "초기화되지 않은"경고를 의도적으로 생략합니다.

++ 및 -(pre 또는 post), +=, -=,. =, | =, ^=, && =, || =입니다.

이들 중 일부는 묶인 변수에 사용될 때 잘못된 경고를 제공합니다. http://perl5.git.perl.org/perl.git/blob/head:/t/op/assignwarn.t.

브라이언이 언급했듯이 : 여전히 그렇게하고, 그것은 단지 당신에게 경고합니다. 경고는 의도하지 않은 효과가있는 특정 조작에 대해 알려줍니다.

당신은 구체적으로입니다 질문 의 가치를 위해 $histogram{$_}, 1에 1을 추가 한 다음 동일한 슬롯에 할당합니다. 여기서는자가 분위기가 작동하지 않을 것으로 예상되는 것과 같은 방식입니다.

my $hash_ref = $hash_for{$key_level_1};
$hash_ref->{$key_level_2} = $value;

여기서와 마찬가지로 :

$hash_for{$key_level_1}{$key_level_2} = $value;

마술은 아마도 최적화처럼 작동하지 않을 것입니다. 컴파일러를 최적화하면이를 알 수 있습니다 a = a + 1 같은 것입니다 a++ 따라서 어셈블리 언어로 인한 증가 연산자가 있었기 때문에 첫 번째 값을 보존해야한다고 주장한 다음 실제로 필요하지 않기 때문에 덮어 쓰는 대신 최적화 된 지시를 사용할 수 있습니다.

최적화는 모든 실행마다 성능 향상을 위해 추가 조사와 오버 헤드입니다. 그러나 역동적 인 언어로는 당신이 그것을 줄이려고하는 것과 같은 속도로 오버 헤드를 추가하지 않는다는 보장은 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top