Cómo implementar programación mixta de Perl y Python
Déjame explicarte dando ejemplos:
1. Perl usa variables definidas en Python
#!/usr/bin/perl -w
use estricto;
use Inline 'Python' => <<'END';
a = 1
END
print $a;
En primer lugar, de este ejemplo podemos aprender el diseño del programa de Inline::Python: un uso típico es poner código Python con
use Inline ' Python' => <<'END';
END
Este es un contenedor de cadenas multilínea de Perl. Por supuesto, hay muchas formas de empaquetar código Python. Para obtener más detalles, consulte la documentación de Inline::Python.
Desafortunadamente, esta castaña no funciona. Sigamos mirando hacia abajo.
2 Perl usa funciones definidas en Python
Código:
#!/usr/bin/perl -w
use estricto;
use Inline 'Python' => <<'END';
def Foo(*args):
print "==Python Def== "
para a en argumentos:
imprimir tipo(a)
imprimir a
END
Foo ( 1); #[1]
Foo('Hola'); #[2]
Foo('Hola','Mundo'); >
Foo(('Hola','Mundo')); #[4]
Foo(['Hola','Mundo']); p>Foo({'Hello' => 1,'World' => 2}); #[6]
Este código se puede ejecutar normalmente. Las funciones definidas en bloques de Python son visibles en Perl. La mayor preocupación es el problema del paso de parámetros, que se analiza uno por uno:
#[1] Si Perl pasa números, Python también los entenderá como números.
#[2] Si Perl pasa el tipo STRING, Python lo entenderá como el tipo str.
#[3] La función admite múltiples parámetros.
#[4] Si Perl pasa el tipo de valor ARRAY (es decir, @), Python lo entenderá como múltiples parámetros. Dado que en Perl el tipo de valor HASH (es decir, %) es en realidad un ARRAY especial, Python debería tratarlo de la misma manera.
#[5] Cuando Perl pasa la referencia ARRAY, Python la entenderá como una lista.
#[6] Cuando Perl pasa una referencia HASH, Python la entenderá como un dict.
El problema del valor de retorno es el mismo.
3 Pasar referencia de función
A veces es necesario pasar un "puntero de función" a Python para implementar devoluciones de llamada.
Inline::Python se ha ocupado de esta necesidad:
#!/usr/bin/perl -w
use estricto;
use Inline 'Python' => <<'END';
def Foo(func):
tipo de impresión(func)
func({'Hola' : 1,' Mundo' : 2})
END
usar Datos::Dumper;
subbarra {
imprimir turno de Dumper; p> p>
}
Foo(\&Bar);
El resultado de su operación:
$VAR1 = {
'Mundo' => 2,
'Hola' => 1
};
En línea: :Python crea un tipo _perl_sub para referencias de funciones. En Python, los valores de este tipo se pueden utilizar como objetos de función.
Por cierto, este ejemplo verifica que Perl entenderá el dict de Python como una referencia HASH.
¿Puede ser más complicado? ¿Qué tal encontrar pareja?
4 Crear instancias de clases definidas en Python
Como lenguaje orientado a objetos, muchas funciones en Python se implementan proporcionando clases.
Mira el código:
#!/usr/bin/perl -w
usa estricto;
usa Inline 'Python ' = > <<'END';
Barra de clase:
def __init__(self,p):
self.p = p
def foo(self,q):
print self.p + q
END
my $bar = Bar->new(1) ;
$bar->foo(2);
Este ejemplo muestra que si la clase Bar está definida en el bloque de Python, es equivalente a un paquete Bar en el entorno Perl. . Inline::Python proporcionará automáticamente un constructor nuevo.
A estas alturas, los problemas básicos casi se han resuelto. Los amigos pueden usar Inline::Python para llamar a todo tipo de bibliotecas extrañas de Python de terceros en Perl sin salir de casa.
¿Puede ser más complicado? Ya es OO...
5 Heredar las clases definidas en Python
No es difícil escribir este código:
#!/usr/bin/perl -w
use estricto;
use Inline 'Python' => <<'END';
barra de clase:
def __init__(self,p):
self.p = p
def foo(self,q): p>
print self.p + q
END
paquete Foo;
nuestro @ISA = ('Bar');
sub nuevo {
mi $clase = turno;
mi $p = turno;
mi $self = $clase->SUPER:: new( $p);
return bendiga $self,$class;
}
subbarra {
my $self = cambio;
mi $q = cambio;
imprimir $self->{p} - $q; ;
paquete principal;
mi $foo = Foo->nuevo(1);
$foo->foo(2);
$foo->bar(3);
Es necesario tener en cuenta algunos puntos:
1) Utilice el @ISA integrado de Perl para heredar las clases proporcionadas por Python .
2) Utilice la palabra SUPER reservada para acceder al objeto principal y no olvide ponerla con el nombre de la clase bless.
3) Si el objeto principal define una variable, se puede acceder a ella mediante el método de clave HASH. En otras palabras, self.p en Python es equivalente a $self->{p}
en Perl.