Hallo Connie,
die kurze (grobe) Antwort ist:
du musst unterscheiden ob es sich um lexikalische Variablen oder Symboltabellenvariablen handelt, diese werden intern total unterschiedlich verwaltet!!!
Erstere - mit "my" definiert - gelten nur innerhalb eines Blockes d.h innerhalb umschließender {} und haben keinen Namespace. Diese dringen auch nicht in eingebettete Blocks ein. Vergleichbar mit "var" in Javascript.
Alle anderen sind an einem Namespace gebunden, der mittels "package" angegeben wird, default ist dabei "main::".
Deren Symboltabellen können auch mit "typeglobs" umfassend manipuliert werden.
Die Verwirrung entsteht historisch, weil es ursprünglich nur Namespaces gab und die lexikalischen Variablen später eingeführt wurden weil man mit "local" unzufrieden war.
"local" (auch lokalglobal genannnt) überschreibt eine *globale* Variable (also namespace!) bis zum Ende des lokalen Blocks und restauriert sie dann wieder, dadurch dringt sie auch - im gegensatz zu my - in eingebettete Blocks/Routinen ein, da es sich nur um eine temporär überschriebene globale variable handelt.
Zu deinem Beispiel:
ersetze my mit our!
(our wurde eingeführt damit strict nicht meckert)
#!/usr/bin/perl -w
use strict;
print "Content-type: text/html\n\n";
my $var1 = "main";
print "main:$var1<br>";package p1;
my $var1 = "p1";
print "p1:$var1<br>";package p2;
my $var1 = "p2";
print "p2:$var1<br>";package main;
print "main:$var1<br>";
>
bye
Kurt
PS: Perl ist leider keine Anfängersprache, sondern ein hochgezüchteter Alleskönner.