The first 'main_package_vars' is in a BEGIN block because it is a duplicate of the one below it. I want to move the BEGIN block out of the package declaration and into the 'main' block.
Then I want to use the package_vars definition in 'main'.
I.e. I started with a BEGIN block only in a package like this (which works, but doesn't work if I remove the BEGIN block as you seem(?) to be suggesting).
#!/usr/bin/perl -w
use strict;
use feature ':5.10';
package MyPackage;
{
BEGIN {
sub package_vars {
foreach(@_) {
eval "sub $_ {
my \$p = shift;
\$p->{$_} = \$_[0] if \@_;
\$p->{$_};
}"
}
}
}
package_vars( qw(one two three) );
sub new {
my $package=shift;
my $parms=$_[0];
my $this={};
foreach(%$parms) {
$this->{$_}=$parms->{$_};
}
bless $this, $package;
}
}
package main;
my $p=new MyPackage({three => 3,});
$p->two(1);
printf "two=%d, three=%d\n",$p->two, $p->three;
Now I try moving the BEGIN block out of the package and into main (thus 'main_package_vars'), and import it's functionality into the local package.
That's the problem I'm trying to solve.
How to have my subroutine definition for 'package_vars' in 'main', and use it from a package, like in this (which doesn't work because package_vars, isn't being 'called' in MyPackage, now that it's been moved to main).
#!/usr/bin/perl -w
use strict;
use feature ':5.10';
BEGIN {
sub package_vars {
foreach(@_) {
eval "sub $_ {
my \$p = shift;
\$p->{$_} = \$_[0] if \@_;
\$p->{$_};
}"
}
}
}
package MyPackage;
*package_vars=\&main::package_vars;
{
package_vars( qw(one two three) );
sub new {
my $package=shift;
my $parms=$_[0];
my $this={};
foreach(%$parms) {
$this->{$_}=$parms->{$_};
}
bless $this, $package;
}
}
package main;
my $p=new MyPackage({three => 3,});
$p->two(1);
printf "two=%d, three=%d\n",$p->two, $p->three;
The first version I posted had samples of the routine package_vars in each location where I could try changing the line that says 'package_vars3( qw(one two three));' to a line without the '3', and, call the original working version, vs. attempts at trying some way to call the version of 'package_vars' that was moved to main.
Is that more clear?