2017-01-13 4 views
0

하위에 선언하고 사용하는 확고한 변수와 변수가있는 하위가 있지만이 하위를 호출 할 때 선언 할 수 없습니다. 예를 들어Perl, 배열을 서브 루틴으로 전달하여 선언되지 않은 변수를 처리합니다.

: 나는, 내가

오류를 가지고 있음을 시도

sub func{ 
my ($firm1, $firm2, $possible) = @_; 
... 
if($possible eq "smth"){ # in case i passed this scalar 
} 
elsif($possible eq ("smth else" or undef/i_don_t_know)){ # in case i didn't passed this var, but i need it as at least undef or smth like that 
} 

func(bla, bla, bla); # ok 
func(bla, bla); # not ok 

"초기화되지 않은 값의 사용이 test.pl 라인 에서 문자열 EQ 가능한 $ ..."

어떻게 해결할 수 있습니까?

+1

귀하의 질문은 선언과 관련이 없습니다. – melpomene

+0

'use strict'와'use warnings '하에서 컴파일 가능한 코드를 보여 주면 많은 도움이 될 것입니다. – Borodin

+0

'use strict'와'use warnings '하에서 컴파일 할 코드를 보여 주면 많은 도움이 될 것입니다. Perl 코드조차 아닌 것을 만드는 것은 당신의 질문을 너무 모호하게 만든다. – Borodin

답변

3

이것은 선언문에는 문제가 없습니다. 당신이

my ($firm1, $firm2, $possible) = @_; 
다음

$possible로 시작하는 서브 루틴에만 두 개의 매개 변수를 전달하는 경우는 다른 언어 등 NULL처럼 특수 값 undef, None, nil로 설정되어 의미 정의되지 않은입니다 당신이 본 것처럼

경고 메시지를 발생시키지 않고 정의되지 않은 값을 비교할 수 없습니다, 당신은 먼저 변수가 정의되어 있는지 확인하기 위해 defined 연산자를 사용합니다

I $possible이 모두 정의되어 있는지 여부를 테스트하고 smth 문자열로 설정하려고한다고 가정합니다. 이런 식으로 할 수 있습니다

sub func { 

    my ($firm1, $firm2, $possible) = @_; 

    if (defined $possible and $possible eq 'smth') { 

     # Do something 
    } 
} 

func(qw/ bla bla bla /); # ok 
func(qw/ bla bla /);  # now also ok 
+0

고마워, 그게 내가 필요로하는 거의 정확한거야. – genesi5

2

선언에는 문제가 없지만 정의되지 않은 값이 전달됩니다. 정의되지 않은 경우 조건부 지정하는 '기본'$possible //= "default_value" 설정 변수

  • defined에 대한

    • 테스트 :

      이 처리의 여러 가지 방법이있다.

    아니면 완전히 다른 작업을 수행하십시오.