A menos que esté tratando de crear un paquete privado que nadie debería saber, puse un paquete por archivo. Eso resuelve el problema. Pero, pongámoslos en el mismo archivo.
El use carga un archivo y llama al método import
en ese paquete. En realidad, solo es un incidente que su argumento se parece a un nombre de módulo. Está buscando el archivo. Si el archivo no está allí, es barfs.
Usted puede hacer esto, donde BarObj
supone que FooObj
está ya allí:
{
package FooObj;
sub new { bless { _count => 0 }, $_[0] }
sub add_data { $_[0]->{_count}++ }
}
{
package BarObj;
use Data::Dumper;
sub new {
bless { myFoo => FooObj->new }, $_[0];
}
sub foo { $_[0]->{myFoo} }
sub some_method { print Dumper($_[0]) }
}
my $bar = BarObj->new;
$bar->some_method;
Si necesita interactuar con un paquete (y eso es todo lo que es: no es un módulo o un objeto), que acaba Necesito tenerlo definido antes de que quieras usarlo. Si tiene que importar algo, puede llamar a la import
directamente:
FooObj->import(...);
Supongamos que hay algo de FooObj
que desea importar (pero no heredará!), Se llama a import
directamente sin carga;
{
package FooObj;
use Data::Dumper;
sub new { bless { _count => 0 }, $_[0] }
sub add_data { $_[0]->{_count}++ }
use Exporter qw(import);
our @EXPORT = qw(dumper);
sub dumper { print Dumper($_[0]) }
}
{
package BarObj;
FooObj->import;
sub new {
bless { myFoo => FooObj->new }, $_[0];
}
sub foo { $_[0]->{myFoo} }
# dumper mixin, not inherited.
sub some_method { dumper($_[0]) }
}
my $bar = BarObj->new;
$bar->some_method;
La sugerencia aparece en el error aquí: "No se puede encontrar FooObj.pm". .pm siempre significa un archivo. –