nazolabo

フリーランスのWebエンジニアが近況や思ったことを発信しています。

perlのお勉強

test.pl

print "application begin\n";

use Sample2;

print "application global\n";

my $s = Sample2->new('hoge');
$s->say('foo');

my $s2 = Sample2->new('fuga');
$s2->say('bar');

print "application end\n";

Sample.pm

package Sample;

BEGIN {
    print "package Sample BEGIN\n";
}

END {
    print "package Sample END\n";
}

print "package Sample global\n";
my $log = 'a';

sub new {
    my ($pkg, $data) = @_;

    print 'Sample constructor: '.$data."\n";

    bless {
        data => $data,
    }, $pkg;
}

sub say {
    my $self = shift;
    my $msg = shift;

    print 'Sample log: '.$log."\n";
    print 'Sample data: '.$self->{data}."\n";

    print 'Sample say: '.$msg. "\n";

    $log = $msg;
}

1;

Sample2.pm

package Sample2;
use Data::Dumper;

use base qw(Sample);
# our @ISA = 'Sample';

BEGIN {
    print "package Sample2 BEGIN\n";
}

END {
    print "package Sample2 END\n";
}

print "package Sample2 global\n";
my $log = 'b';

sub new {
    my ($pkg, $data) = @_;

    print 'Sample2 constructor: '.$data."\n";

    bless {
        data => $data,
    }, $pkg;
}

sub say {
    my $self = shift;
    my $msg = shift;

    $self->SUPER::say($msg);

    print 'Sample2 log: '.$log."\n";
    print 'Sample2 data: '.$self->{data}."\n";

    print 'Sample2 say: '.$msg. "\n";
}

1;

結果

package Sample BEGIN
package Sample global
package Sample2 BEGIN
package Sample2 global
application begin
application global
Sample2 constructor: hoge
Sample log: a
Sample data: hoge
Sample say: foo
Sample2 log: b
Sample2 data: hoge
Sample2 say: foo
Sample2 constructor: fuga
Sample log: foo
Sample data: fuga
Sample say: bar
Sample2 log: b
Sample2 data: fuga
Sample2 say: bar
application end
package Sample2 END
package Sample END

なんとなくわかった気がする!