2010-02-02 3 views
2

win32에서 ActiveState Perl 5.10.1을 실행 중입니다.Perl에서 값을 초기화 할 수 없지만 여전히 정의 할 수 있습니까?

어떻게 그것을이 코드가 :

die($r->unparsed_uri =~ '/(logout.pl)?$'); 

...이 Use of uninitialized value in die로 사망 :

die(defined($r->unparsed_uri =~ '/(logout.pl)?$')); 

...이 말을 같은 라인을 변경하는 반면, 1로 사망?

어째서 defineduninitialized? 나는 uninitialized가 미정이라고 생각했다.

+1

필자는 이것이 단지 펑키 한 스칼라 대리스트 컨텍스트 일 ​​뿐이라고 확신한다. – fennec

답변

8

첫 번째 경우에는 일치 연산이 스칼라 컨텍스트에서 수행됩니다. 두 번째 경우, 당신이 쓴 거의 것처럼, 배열 맥락에서 일어나고 : 일치하는 문자열이 "/"로 끝났다 때문에

$r->unparsed_uri 패턴과 일치하는 경우
my @groups = $r->unparsed_uri =~ '/(logout.pl)?$'; 
die @groups; 

하지만 $1가 정의되지 않은, 다음 @groups 것 단일 요소 undef을 포함하는 길이가 1 인 배열.

die(undef); 
+0

fennec이 옳았다. 설명 주셔서 감사합니다! – Kev

+0

아, 그리고 분명히 밝혀지지 않았다면, 당신이 die (스칼라 ($ r-> unparsed_uri = ~ '/(logout.pl)?$'))와 함께 기대했던 행동을 얻을 수 있다고 언급 했어야했습니다; – Sean

2

당신이 경고가 활성화 말라 : 당신이 말한 것처럼

모두 함께 넣어, 그건?

#!/usr/bin/perl -l 

use strict; use warnings; 

my $uri; 

die(defined($uri =~ '/(logout.pl)?$')); 

나는 무슨 일이 일어나고 있는지에 대해 설명

Use of uninitialized value $uri in pattern match (m//) at E:\t.pl line 7. 
1 at E:\t.pl line 7.

을 얻을 감안할.

$uri이 정의되어 있지 않으므로 m//에 경고가 표시됩니다. $uri이 정의되어 있지 않기 때문에 일치 결과는 false이지만 으로 정의됩니다. 따라서 defined은 true를 반환하고 die1을 출력합니다.

+1

''undef = ~/(bar)? /'일 필요는 없다고 생각합니다 -''foo "= ~/(bar)? /'는보고 된 행동을 생성 할 수 있다고 생각합니다. – fennec

+0

@fennec 방공호가 왜 그가 본 행동을 보았는지 설명했습니다. 정의 된 (...) 내부에있는 것은 거짓이지만 정의되어 있습니다. '$ r-> unparsed_uri'는 질문의 제목이 의미하는 것처럼 초기화되지 않고 정의되지 않습니다. –