문제

해시 참조를 사용하는 일부 Perl과 씨름하고있었습니다.

결국 내 문제는 라인이라는 것이 밝혀졌습니다.

$myhash{$key} |= {};

즉, "값이 이미없는 한, 빈 해시에 대한 참조를 할당하십시오."

그러나 이것을 비두용하고 해시 참조로 사용하려고 시도하면 문자열을 해시 참조로 사용하는 것에 대한 통역사 오류가 발생했습니다.

변경 :

if( ! exists $myhash{$key}) {
  $myhash{$key} = {};
}

... 일을 작동 시켰습니다.

그래서 나는 없다 문제. 그러나 나는 무슨 일이 일어나고 있는지 궁금합니다.

누구든지 설명 할 수 있습니까?

도움이 되었습니까?

해결책

문자열을 해시 참조로 사용하는 것에 대한 오류가 발생하는 이유는 잘못된 연산자를 사용하기 때문입니다. |= "Bitwise 또는 Assign"을 의미합니다. 다시 말해,

  $foo |= $bar;

와 같다

  $foo = $foo | $bar

예에서 일어나는 일은 새로운 익명 해시 참조가 줄어들고 값으로 비트를 제공한다는 것입니다. $myhash{$key}. 문제를 더 혼동시키기 위해 $myhash{$key} 당시에 정의되지 않으면 값은 해시 참조의 간단한 문자열입니다. HASH(0x80fc284). 따라서 구조물을 검사하는 경우 바라보다 해시 참조와 같지만 그렇지 않습니다. 다음은 유용한 출력이 있습니다 Data::Dumper:

   perl -MData::Dumper -le '$hash{foo} |= { }; print Dumper \%hash'
   $VAR1 = {
             'foo' => 'HASH(0x80fc284)'
           };

그리고 올바른 연산자를 사용할 때 얻을 수있는 것은 다음과 같습니다.

  perl -MData::Dumper -le '$hash{foo} ||= { }; print Dumper \%hash'
  $VAR1 = {
            'foo' => {}
          };

다른 팁

Perl에는 속기 할당 연산자가 있습니다. 그만큼 ||= 연산자는 종종 논리 연산자가 평가 된 마지막 값을 반환하는 Perl의 특징으로 인해 변수의 기본값을 설정하는 데 사용됩니다. 문제는 당신이 사용했다는 것입니다 |= 그것은 a입니다 비트 또는 대신 ||= 그것은 a입니다 논리적 또는.

Perl 5.10 기준으로 사용하는 것이 좋습니다 //= 대신에. // 논리 정의 또는 연산자이며 현재 값이 정의 된 코너 케이스에서는 실패하지 않습니다.

나는 당신의 문제가 사용 중이라고 생각합니다.|="대신 (비트 타이어 또는 할당)"||="(false 인 경우 할당).

새 코드는 정확히 동일하지 않습니다. 차이점은 "$myhash{$key} ||= {}"기존의 값이지만 퍼포먼스 값을 해시 참조로 대체 할 것이지만, 새로운 값은 그렇지 않을 것입니다. 실제로는 관련이 없을 것입니다.

이 시도:

my %myhash;
$myhash{$key} ||= {};

해시를 선언 할 수 없습니다 요소 안에 my 내가 아는 한 조항. 해시를 먼저 선언 한 다음 요소를 추가하십시오.

편집 : 당신이 꺼내는 것을 봅니다 my. 시도하는 것은 어떻습니까 ||= 대신에 |=? 전자는 "게으른"초기화에 관용적입니다.

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