Le variabili in Perl sono di diversi tipi. I tipi comuni includono:
È necessario specificare variabili globali con nomi univoci. È anche possibile utilizzare variabili locali, utilizzando la convenzione my. Ad esempio:
my ($uvComponent);
È possibile che esistano delle funzioni hook Perl che hanno problemi di ricerca del nome. Un'azione Rational ClearQuest, ad esempio Submit, utilizza un programma di interpretazione Perl singolo per eseguire tutti gli hook dell'azione, come l'inizializzazione dell'azione, e tutti gli hook del campo, come ad esempio Valore campo modificato, che sono scritti in Perl. Se il codice hook non dichiara variabili locali con la parola chiave my prima di utilizzarle, la variabile può essere condivisa tra le funzioni hook involontariamente.
Nei rilasci precedenti alla versione 2003.06.00, quando una funzione hook Perl ne chiamava un'altra, la seconda veniva compilata in un diverso spazio nomi Perl. Nel rilascio della versione 2003.06.00 e successive, tutte le funzioni hook vengono compilate nello stesso spazio nomi Perl. Ciò può influire sul modo in cui diverse funzioni hook possono interagire con le altre, se vengono utilizzate variabili globali. Ad esempio:
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"; }
La variabile chiamata $variable in queste routine secondarie della funzione hook è una variabile di ambito package. Ciò significa che le routine secondarie nello stesso package condividono la stessa variabile.
Nei rilasci precedenti alla versione 2003.06.00, le funzioni hook nidificate erano in un package Perl diverso dalla funzione hook iniziale e perciò non condividevano le relative variabili globali con la funzione hook iniziale. Ciò significa che il precedente esempio era interpretato come se avesse il seguente qualificatore spazio nomi:
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"; }
Una funzione hook valore campo modificato viene immediatamente chiamata sulla modifica del campo associato (ossia, prima di essere riportato da SetFieldValue), così il codice precedente viene eseguito in questo ordine:
$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"
Di conseguenza, i campi A, B e C sono impostati su "1", "" e "3", rispettivamente.
A partire dal rilascio della versione 2003.06.00, le funzioni hook Perl vengono compilate nello stesso spazio nomi. L'esempio precedente viene ora interpretato come se avesse il seguente qualificatore spazio nomi:
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"; }
Tale codice viene eseguito in quest'ordine:
$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"
Di conseguenza, i campi A, B e C sono impostati su "1", "1" e "3", rispettivamente.
Per impedire condivisioni involontarie dei valori della variabile, è necessario dichiarare tali variabili come locali rispetto ad una funzione hook in questo modulo:
sub d_ValueChanged { my $temp = $entity->GetFieldValue("d")->GetValue(); $session->OutputDebugString("d now set to $temp\n"); }
dove $temp viene dichiarato come locale rispetto alla funzione d_ValueChanged e questa assegnazione a $temp non modifica il valore di un'altra variabile con lo stesso nome. L'utilizzo della sintassi my rende la variabile visibile solo in una determinata parte di codice.