Si vous dites __PACKAGE__->run(@ARGV)
alors run
peut être définie dans une classe que vous héritez de ou permet à une classe d'hériter de celui-ci. Si vous venez de dire run(@ARGV)
vous manquez les informations de classe. Cela n'a d'importance que si vous faites de la programmation de style OO.
Mettez ce qui suit dans un fichier nommé Foo.pm
, puis dire perl Foo.pm 1 2 3
package Foo;
use strict;
use warnings;
__PACKAGE__->main(@ARGV) unless caller;
sub main {
my $class = shift;
my $obj = $class->new(@ARGV);
print $obj->to_string, "\n";
}
sub new {
my $class = shift;
return bless [@_], $class;
}
sub to_string {
my $self = shift;
return "args: " . join ", ", map { "[$_]" } @$self;
}
1;
maintenant mis les éléments suivants dans Bar.pm
, et dire perl Bar.pm a b c
.
package Bar;
use strict;
use warnings;
use base 'Foo';
__PACKAGE__->main(@ARGV) unless caller;
sub to_string {
my $self = shift;
return "args: " . join ", ", map { "<$_>" } @$self;
}
1;
Maintenant, voyons ce qui se passe si vous n'utilisez pas __PACKAGE__
dans cet environnement. Faire la première section de code à Foo.pm
ressembler à ceci:
main(@ARGV) unless caller;
sub main {
my $obj = Foo->new(@ARGV);
print $obj->to_string, "\n";
}
Exécutez maintenant perl Foo.pm 1 2 3
. Tout devrait toujours bien paraître. Maintenant, essayez d'exécuter perl Bar.pm a b c
. Nous obtenons toujours des résultats, mais ce n'est pas la sortie que nous attendons. Que se passe-t-il si nous supprimons __PACKAGE__
de Bar.pm
? Eh bien, nous obtenons et erreur: Undefined subroutine &Bar::main called at Bar.pm line 8.
C'est parce qu'il n'y a pas main
fonction dans le module et nous ne l'appelons pas avec la classe, donc il ne sera plus le chercher dans le paquet Foo
.