2012-06-21 4 views
2

저는 학생 프로그래밍 과제 수정을 위해 Perl에 스트레스 시스템을 구축하고 있습니다. 나는 그 길을 따라 나를 돕기로되어있는 함수 check(<boolean>,<congrats-message>,<blame-message>)을 만들었다.펄 함수 인수가 사라집니다. 왜?

나는

check(get_option('content-type') eq "text/html","good type", "bad type"); 

모든 것이 괜찮로 호출 할 때. 하지만 내가 할 수 있다면

check(get_option('content-type') =~ m:text/html:i, "good type", "bad type"); 

정규 표현식이 일치 항목을 찾지 못하면 깨집니다. 실제로는 check("good type", "bad type")과 같습니다. check() 함수에서 $_[0], $_[1] 등만 사용하고, 첫 번째 인수로 'undef'가있는 것과 같지 않습니다. die unless $#_ == 2으로 버그를 잡을 수 있습니다.

무슨 일입니까? 나는

check((get_option('content-type') =~ m:text/html:i && 1), "good type", "bad type"); 

그것을 해결할 그러나 나는 무엇을 왜 이상한 상황을 이해하고 싶네요.

-

sub check { 
    if ($_[0]) { 
    $okay++; 
    print STDERR "^_^ $_[1] ($okay)\n"; 
    } else { 
    print STDERR ">_< $_[2]\n"; 
    } 
    return $_[0]; 
} 

답변

6

항상 true 또는 false를 돌려 eq하지만 =~ (시리스트 문맥에서) 반환 "패턴에서 괄호로 일치하는 표현식으로 구성된 목록".

목록을 다른 목록 (예 : 서브 루틴 인수 목록 안에있는 일치 목록)에 넣으면 병합됩니다.

일치 항목이 0 개있는 경우 목록에 2 개의 다른 인수가 있습니다.

일치하는 항목이 2 개있는 경우 총 4 개의 인수에 대해 2 개의 다른 인수를 얻습니다.

코드에는 정확히 세 가지 인수가 있습니다.

+0

그래서 "... && 1"대신 "스칼라 (...)"를 사용할 수있었습니다. 맞습니까? – PypeBros

+0

할 수 있어야합니다. – Quentin

+0

"목록을 다른 목록에 넣으면 병합됩니다." 아, 좋은 알림. 그렇기 때문에 LoL을 얻으려면 몇 가지 추가 트릭이 필요합니다. – PypeBros

관련 문제