2013-09-07 1 views
1

질문 서브 루틴 :펄 - CGI 모듈 매개 변수로 전달 PARAM()는 펄 CGI 모듈을 사용하는 방법에 대한

의 다음과 같이 내가 정의 된 두 개의 매개 변수를 받아들이는 하위라는 foo에 있다고 가정 해 봅시다 :

sub foo { 
    local($a, $b) = @_; 
    print "a= [$a]"; 
} 
내 메인 루틴에서

, 나는이 같은 foo는 몇 가지 형태의 매개 변수를 사용하고 전달할 :

use CGI; 
$cgi = CGI->new; 
foo($cgi->param('field1'), $cgi->param('field2')); 

양식 필드 1의 값을 전달하지 않은 경우

는 (내 경우, SELECT 필드는 필드 1 위스콘신라고 어떤 값도 선택하지 않았을 때), sub foo는 $ a를 $ cgi-> param ('field2')에 전달 된 값으로 설정합니다.이 값은 비어 있지 않은 값입니다.

왜 이런 일이 일어나고 왜 $ a는 단순히 공백 (') 값이 아니고 $ b = $ cgi-> param ('field2 ')에서 전송 된 값이 아닌지 이해할 수 있습니까?

나는 논리적 인 이유가있을거야,하지만 난하지 펄 나는 그것이 내가 배우거나 펄에 대해 이해하는 것이 아직했습니다 뭔가 확신 그래서 프로입니다.

미리 감사드립니다.

+1

(그리고 당신은'$의 A'와'사용하지 말아야합니다 $ b'를 특별히'sort'를 위해 사용하는 변수 이름으로 사용합니다.)'my ($ foo, $ bar) = @_;' – friedo

+0

죄송합니다 - $ a와 $ b를 사용하여 방금 나타났습니다. 임의의 두 변수. 이것은 제가 성취하고자하는 것을 보여주기 위해 만들어지는 예일뿐입니다. 나는 하위 안에 실제 매개 변수로 사용하지 않습니다. 서브 루틴에서 수신되는 매개 변수 변수를 선언하기 위해 로컬이 부적절한 것으로 여겨지는 이유에 대해 궁금합니다. – Vinnie

+0

'local'이라는 이름이 잘못 붙여 졌기 때문에. 로컬 변수는 생성하지 않습니다. 당신이 기대했던대로 작동하는 지역화 된 변수를 만들고, 항상'my'를 사용하십시오. –

답변

3

CGIparam() 기능은 목록 또는 스칼라 컨텍스트에서 호출하는 경우 다르게 동작합니다. 스칼라 컨텍스트에서는 첫 번째 매개 변수 값이 반환됩니다. 목록 컨텍스트에서는 모든 매개 변수 값이 반환됩니다 (CGI는 키마다 여러 값을 가질 수 있음을 기억하십시오).

이 같은 함수를 호출하는 경우

후리스트 문맥이 사용됩니다. 즉, $cgi->param('field1')이 빈 목록으로 평가되고 $cgi->param('field2')의 첫 번째 값은 서브 루틴의 $a에 지정됩니다. 이것을 피하려면 명시 적으로 스칼라 컨텍스트를 강제해야합니다. 이것은 scalar를 사용하여 수행 할 수 있습니다 :

foo(scalar($cgi->param('field1')), scalar($cgi->param('field2'))); 

또 다른 가능성은 중간 변수를 사용하는 것입니다

my $field1 = $cgi->param('field1'); # scalar context here 
my $field2 = $cgi->param('field2'); 
foo($field1, $field2); 
현재 local``사용하지 않아야