The scope node is used for every new scope in the code. It delimits the lifespan of variables and pragmas. If a pragma is defined a new scope is open, if a variable is redeclared, a new scope is open. An optimizer can reuse the scope for pragma declarations in the start of the code. But it cannot rename the re-declared variable, as the stash can be manipulated, just emit a warning.
block_decl helloworld
The package node is the root node of a Perl5 AST. It can declare subroutines, global variables. It inherits the ``scope'' node as every package defines a new scope.
block_decl helloworld
A block is a scope (inherits scope) defined explicitly. It tell us that it is ok to redeclare a variable, and no warning is necessary. It is also the boundary for closures.
block_decl
The variable_declaration is the super-class for scoped and global variable declaration. It defines how a variable can be declared.
Defines a variable with a limited visibility, either by name or by value. Inherits variable_declaration.
This node causes the same effect of the ``our'' declaration, but appears here even if the declaration didn't appears in the original code.