`$ hash {$ key} | = {}`perl에서 무엇을합니까?
-
03-07-2019 - |
문제
해시 참조를 사용하는 일부 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
. 시도하는 것은 어떻습니까 ||=
대신에 |=
? 전자는 "게으른"초기화에 관용적입니다.