Perl 후크에서 이름 찾아보기

Perl에서의 변수는 여러 유형이 있습니다. 일반적인 유형은 다음과 같습니다.

고유 이름을 가진 전역 변수를 지정해야 합니다. my 규칙을 사용하여 로컬 변수를 사용할 수도 있습니다. 예를 들어, 다음과 같습니다.

my ($uvComponent);
주: Perl 후크에서 변수를 로컬로 설정할 때 my 선언을 사용하십시오.

기존의 Perl 후크에 이름 찾아보기 문제점이 있을 수 있습니다. 예를 들어, Rational® ClearQuest® 조치인 제출은 단일 Perl 해석기를 사용하여 Perl로 작성된 조치 초기화와 같은 모든 조치 후크, 필드 값 변경과 같은 모든 필드 후크를 실행합니다. 후크 코드가 로컬 변수를 사용하기 전에 my 키워드를 사용하여 변수를 선언하지 않으면, 비의도적으로 후크 간에 변수를 공유할 수 있습니다.

버전 2003.06.00 이전 릴리스에서는 하나의 Perl 후크가 다른 후크를 호출할 때 두 번째 후크가 다른 Perl 네임스페이스에 컴파일되었습니다. 릴리스 버전 2003.06.00 이상에서는 모든 후크가 동일한 Perl 네임스페이스에 컴파일됩니다. 이는 전역 변수를 사용하는 경우 서로 다른 후크가 상호 간섭하는 방법에 영향을 줄 수 있습니다. 예를 들어, 다음과 같습니다.

sub defect_Initialization

{

 $variable = "1";

 $entity->SetFieldValue("A", $variable);

}

sub a_ValueChanged

{

 $entity->SetFieldValue("B", $variable);

 $entity->SetFieldValue("C", $variable);

}

sub b_ValueChanged

{

 $variable = "3";

} 

이러한 후크 서브루틴에서 $variable이라는 변수는 패키지 범위 변수입니다. 이는 동일한 패키지의 서브루틴이 동일한 변수를 공유함을 의미합니다.

버전 2003.06.00 이전의 릴리스에서는 중첩된 후크가 초기 후크와 다른 Perl 패키지에 있었기 때문에 초기 후크와 전역 변수를 공유하지 않았습니다. 이는 이전 예제가 다음 네임스페이스 규정자를 가지는 것으로 해석되었음을 의미합니다.

package main;

sub defect_Initialization

{

 $main::variable = "1";

 $entity->SetFieldValue("A", $main::variable);

}

package CQEntity;

sub a_ValueChanged

{

 # $CQEntity::variable is not set, so defaults to an empty string.

 $entity->SetFieldValue("B", $CQEntity::variable);

 $entity->SetFieldValue("C", $CQEntity::variable);

}

sub b_ValueChanged

{

 $CQEntity::variable = "3";

} 

필드 값 변경 후크는 연관된 필드를 변경하는 즉시(즉, SetFieldValue에서 리턴되기 전에) 호출되므로 이전 코드는 다음 순서로 실행됩니다.

 $main::variable = "1";    # From defect_Initialization;

       # $main::variable is set to "1"

 $entity->SetFieldValue("A", $main::variable); # From defect_Initialization

       # Sets A to "1"

       # Rational ClearQuest calls a_ValueChanged before returning

 $entity->SetFieldValue("B", $CQEntity::variable); # From a_ValueChanged

       # $CQEntity::variable is uninitialized

       # Sets B to ""

       # Rational ClearQuest calls b_ValueChanged before returning

 $CQEntity::variable = "3";   # From b_ValueChanged

       # $CQEntity::variable changes from "" to "3"

 $entity->SetFieldValue("C", $CQEntity::variable); # From a_ValueChanged

       # Sets C to "3" 

따라서 필드 A, B 및 C는 각각 "1", "" 및 "3"으로 설정됩니다.

릴리스 버전 2003.06.00부터 Perl 후크는 동일한 네임스페이스에 컴파일됩니다. 이제 이전 예제는 다음 네임스페이스 규정자를 가지는 것으로 해석됩니다.

package main;

sub defect_Initialization

{

 $main::variable = "1";

 $entity->SetFieldValue("A", $main::variable);

}

sub a_ValueChanged

{

 $entity->SetFieldValue("B", $main::variable);

 $entity->SetFieldValue("C", $main::variable);

}

sub b_ValueChanged

{

 $main::variable = "3";

} 

이 코드는 다음 순서로 실행됩니다.

 $main::variable = "1";    # From defect_Initialization;

       # $main::variable is set to "1"

 $entity->SetFieldValue("A", $main::variable); # From defect_Initialization

       # Sets A to "1"

       # Rational ClearQuest calls a_ValueChanged before returning

 $entity->SetFieldValue("B", $main::variable); # From a_ValueChanged

       # Sets B to "1"

       # Rational ClearQuest calls b_ValueChanged before returning

 $main::variable = "3";    # From b_ValueChanged

       # $main::variable changes from "1" to "3"

 $entity->SetFieldValue("C", $main::variable); # From a_ValueChanged

       # Sets C to "3" 

따라서 필드 A, B 및 C는 각각 "1", "1" 및 "3"으로 설정됩니다.

비의도적으로 변수값을 공유하지 않도록 하려면 후크 함수에 대해 로컬이 되도록 다음 양식으로 해당 변수를 선언해야 합니다.

sub d_ValueChanged

{

 my $temp = $entity->GetFieldValue("d")->GetValue();

 $session->OutputDebugString("d now set to $temp\n");

} 

여기서 $temp는 d_ValueChanged 함수에 대해 로컬로 선언되며, $temp 지정으로 인해 동일한 이름의 다른 변수값이 변경되지 않습니다. my 구문을 사용하면 지정된 코드 블록 내에서만 변수를 볼 수 있습니다.

주: $entity$sessionRational ClearQuest 코어로 정의된 전역 변수입니다.

피드백