Personally, I find shared variables quite useful, but there you go. Everyone has their own ways of coding.
A shared variable is, as far as I am aware, only shared according to how it is defined.
So, if p1.p has a new shared variable and calls p2.p that has the shared variable defined and calls p3.p then you can access the shared variable in p3.p.
If you don't define the shared variable in p2.p and run p3.p from p2.p then I don't think it will like the shared variable definition.
If you use "define new global shared variable" then it can handle skips so p3.p would work just fine.
Also, if you redefine the variable in another program, then that kills off the shared variable, but a global shared variable will still be available in other programs.
So, if you have:
p1.p: define new shared variable myshared as char no-undo.
p2.p: define shared variable myshared as char no-undo.
p3.p: define variable myshared as char no-undo.
and p1.p calls p2.p which calls p3.p then p3.p will not share the variable.
Also, if you use
p3.p: define new shared variable myshared as char no-undo.
and p1.p calls p2.p which calls p3.p then p3.p will start the share again and anything further down the line will share the variable up to p3.p. This can be confusing, especially if the variable is defined as new several times.
So, if you have a variable that has been shared and you don't want it shared past the current program but want to use the same variable in your program, just redfine it without the shared part. But be careful, shared variables are normally shared for a reason.
How's that? Clear as mud?