Variablen haben in Perl verschiedene Typen. Häufig verwendete Typen:
Globale Variablen müssen mit eindeutigen Namen angegeben werden. Sie können auch lokale Variablen mit der Konvention my verwenden. Beispiel:
my ($uvComponent);
Bei vorhandenen Perl-Hooks kann es zu Problemen bei der Namenssuche kommen. Eine Rational ClearQuest-Aktion wie Submit (Übergeben) verwendet zur Ausführung aller Aktions-Hooks (z. B. Action Initialization = Aktionsaktualisierung) und aller Feld-Hooks (z. B. Field Value Changed = geänderter Feldwert), die in Perl geschrieben wurden, nur einen Perl-Interpreter. Wenn der Hook-Code lokale Variablen vor der Verwendung nicht mit dem Schlüsselwort my deklariert, kann die Variable unabsichtlich von mehreren Hooks gemeinsam genutzt werden.
Wurde in Releases vor 2003.06.00 ein Perl-Hook von einem anderen Perl-Hook aufgerufen, wurde der zweite Hook in einem anderen Perl-Namespace kompiliert. Seit Release 2003.06.00 werden alle Hooks im selben Perl-Namespace kompiliert. Dieser Umstand kann Auswirkungen darauf haben, wie sich verschiedene Hooks bei Verwendung von globalen Variablen gegenseitig behindern können. Beispiel:
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";
}
Die Variable $variable in diesen Hook-Subroutinen ist eine Variable im Geltungsbereich des Pakets. Das bedeutet, dass die Subroutinen in einem Paket eine Variable gemeinsam nutzen.
In Releases vor 2003.06.00 befanden sich verschachtelte Hooks in einem anderen Perl-Paket als der ursprüngliche Hook, und deshalb wurden die zugehörigen globalen Variablen nicht gemeinsam mit dem ursprünglichen Hook genutzt. Das obige Beispiel wurde also so interpretiert, als ob die folgenden Namespace-Qualifikationsmerkmale vorhanden gewesen wären:
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";
}
Ein Hook von Typ "Field Value Changed" wird unmittelbar nach Änderung des zugeordneten Felds aufgerufen (d. h. vor der Rückkehr aus SetFieldValue), sodass der vorhergehende Code in dieser Reihenfolge ausgeführt wird:
$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"
Demzufolge werden die Felder A, B und C jeweils auf "1", "" und "3" gesetzt.
Ab Releaseversion 2003.06.00 werden Perl-Hooks im selben Namespace kompiliert. Das obige Beispiel wird jetzt so interpretiert, als ob die folgenden Namespace-Qualifikationsmerkmale vorhanden wären:
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";
}
Dieser Code wird in dieser Reihenfolge ausgeführt:
$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"
Demzufolge werden die Felder A, B und C jeweils auf "1", "1" und "3" gesetzt.
Diese Variablen müssen für eine Hook-Funktion wie folgt als lokal deklariert werden, um eine unabsichtliche gemeinsame Nutzung von Variablenwerten zu vermeiden:
sub d_ValueChanged
{
my $temp = $entity->GetFieldValue("d")->GetValue();
$session->OutputDebugString("d now set to $temp\n");
}
Dabei gilt Folgendes: $temp wird für die Funktion d_ValueChanged als lokal deklariert, und diese Zuordnung zu $temp ändert den Wert einer anderen Variablen mit demselben Namen nicht. Bei Verwendung der Syntax myx ist die Variable nur innerhalb eines bestimmten Codeblocks sichtbar.