2012-10-29 5 views
0

는 문 모든 시간존재하고 정의 된 Perl 서브 루틴이 있습니까? 내가 사용하는

if (exists($a->{b}) and defined($a->{b}) 

동시에이 두 가지를 수행하는 서브 루틴이있는 경우 존재의 정의?

업데이트 :
나는 아주 좋은 예제 코드를 제공하지 않았다. 더 나은 질문과 일치하는 답변은 checking-for-existence-of-hash-key-creates-key을 확인하십시오. 코멘트에 응답에 대해서는

if (defined($a->{b})) 

같은 일이

답변

2

defined(...)exists(...) 사실, 그래서 경우에만 사실 일 수에 대한 대답하여 문제는 서브 루틴이 defined입니다. 키가 (경우에도 미확정 값)이있는 경우

+0

그건 옳지 않습니다. 최악의 경우'- a' 연산자를 사용하면 우연히'$ a'를 해시 참조로 승격시킵니다. – mob

+0

필자의 초기 가정은 틀렸습니다 (키를 생성하지 않음). –

+0

nit :'정의 된 '은 연산자가 아니고 서브 연산자입니다. – ikegami

6

, defined 열쇠를 인스턴스화하지 않습니다. 한편, 정상적으로 자동 생체 화한다.

>perl -E"if (defined($a->{b})) { } say $a || 0;" 
HASH(0x3fbd8c) 

그렇지만 exists의 경우도 마찬가지입니다. 당신이 autovivification을 피하려고하는 경우

>perl -E"if (exists($a->{b}) and defined($a->{b})) { } say $a || 0;" 
HASH(0x81bd7c) 

, 당신이 사용하는 거라고

>perl -E"if ($a && defined($a->{b})) { } say $a || 0;" 
0 

또는

>perl -E"no autovivification; if (defined($a->{b})) { } say $a || 0;" 
0 
+0

아니요, 해시에 정의 된 것을 사용하면 부주의하게 키가 생성됩니다. –

+0

"아니, 그렇지 않아"는 5yo의 대답이다. 그것을 뒷받침하지 않고, 또는 적어도 귀하의 주장을 검증하지 않고 누군가를 모순하지 마십시오. 내 코드는 절대로 키를 만들지 않습니다. '$ a'에 해시 참조를 만들 수 있지만 원본 코드도 만들 수 있습니다. (해시 참조를 생성하는 것은'->'입니다. 이것은 코드와 코드에서 가장 먼저 실행됩니다.) – ikegami

+2

@EricFossum 2 차원에서'defined'를 사용하면 자동 가상화를 생각할 수도 있습니다 구조체는'$ foo -> {bar} {baz}'와 같이 하위 수준'$ foo -> {bar}'을 생성하지만 baz는 생성하지 않습니다. – TLP

1
  • 는() 검사를 존재
  • 정의() 검사를에만 있는지 확인하려면

을 정의 된 값이있는 경우 키가 존재한다면 (심지어 undef 일지라도) 이 존재합니다.

여기에 아주 잘 설명되어있는 관련 질문이 있습니다 : What's the difference between exists and defined?

관련 문제