2009-08-01 5 views
4

Dans ce earlier Stackoverflow question et surtout brian d foy's "How a Script Becomes a Module" j'ai lu sur la façon de mettre en place un code afin qu'il puisse être exécuté comme un script ou un module, en utilisant cette technique:Lors de la configuration du code Perl en script ou en module, quelle est la raison de __PACKAGE__?

package SomeModule; 

__PACKAGE__->run(@ARGV) unless caller(); 

sub run { 
    # Do stuff here if you are running the file as 
    # a script rather than a module. 
} 

Quel est le but de __PACKAGE__ en cette configuration? Pourquoi ne pas faire ça?

run(@ARGV) unless caller(); 

Répondre

13

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.

Questions connexes