NAME
perlmodule - Embed a Perl interpreter in Python
SYNOPSIS
import perl
# Simple arithmetics
six = perl.eval("3+3")
# Eval can also return functions
sum = perl.eval("sub { my $s = shift; $s += shift while @_; $s }")
print sum(1,2,3)
# Example of using a perl module from python
perl.require("Digest::MD5")
md5 = perl.callm("new", "Digest::MD5")
md5.add("Foo")
md5.hexdigest()
# Direct manipulation of perl data
inc = perl.get_ref("@INC")
inc.append("./extra")
DESCRIPTION
The perl
module allows you to easily embed a Perl interpreter in any Python program. It can be used to invoke arbitrary Perl code, load any Perl modules and make calls directly into Perl functions. The Perl code invoked can call back into Python as it see fit.
The following functions are made available by the perl
module:
- perl.eval( CODE )
-
The
perl.eval
function takes a string of perl code as argument and will let perl compile and execute the code. The code is evaluated in scalar context and returns the value of the last statement executed.Any exception raised by perl will be turned into
perl.PerlError
exception for Python. The content of$@
is avalable as the value of the python exception. - perl.require( MODULE )
-
This will load the perl module into the perl interpreter. If the module can not be located or fails to load properly, then a
perl.PerlError
exception is raised. - perl.call( FUNC, ARGS,... )
-
This will call the perl function named
FUNC
with the given arguments. See the section about calling perl functions below. - perl.callm( METHOD, OBJ, ARGS,... )
-
This will call the perl method on the object with the given arguments. The
OBJ
argument can also be a string denoting the name of a class. This is used to call class methods, like constructors. - perl.defined( NAME )
-
This function check if a thing identified by NAME is defined in the perl name space. If the name is not prefixed with a perl data type symbol ("$", "@", "%", "$" or "&") then it is assumed to be the name of a function (i.e. "&" is assumed).
- perl.get_ref( NAME, [ CREATE ] )
-
This function is used to obtain references to things inside the perl name space. The function can also be used to construct new anonymous perl data objects.
The
NAME
argument is the name of the thing to obtain a reference to. If the name is not prefixed with a perl data type symbol ("$", "@", "%", "$" or "&") then it is assumed to be the name of a function (i.e. "&" is assumed). If the optionalCREATE
argument is given and is TRUE, then the named object will be created unless it already exists. IfCREATE
is FALSE, and the named object does not exists, then aperl.PerlError
exception will be raised.If the
NAME
argument is simply "$", "@" or "%" then a new scalar, array or hash is created and a reference to it is returned. This is much more efficient than using something like perl.eval("[]") to obtain an anonymous perl array reference. - perl.array( SEQUENCE )
-
This function works in the same way as the python list() or tuple() builtin functions. It will turn any python SEQUENCE object into a perl array.
The following attributes are available:
- perl.PerlError
-
The perl exception object. See the section on Exceptions below.
- perl.MULTI_PERL
-
This value is TRUE if the perlmodule was compiled with the MULTI_PERL flavour and FALSE otherwise.
When MULTI_PERL is enabled, then each python thread will get its own separate perl interpreter. This avoid the need for a perl lock and allow full concurrency for perl code executing in different threads.
Calling perl functions
There are 4 ways perl functions can be called from python. Named functions and class methods can be invoked through the perl.call() and perl.callm() functions. In additon reference to perl code objects and methods on reference to other perl objects can be called directly.
Data types of arguments and return values are mapped between the languages as follows:
Python Perl
-------------- ------------------------------------
None <---> undef
string <---> string
float <---> number
int <---> int
long <---> int (or Python::Object if overflow)
perl ref object <---> ref
object <---> Python::Object
Python keyword arguments are passed to perl as key/value pairs after any other arguments. Keywords that start with "__
" are reserved and not passed on. The special keyword argument __wantarray__
can be used to specify what context to call the perl function in. A function called in array context always return a tuple.
Array context can also be set up with versions of perl.call() and perl.callm() with _tuple
suffix; i.e. perl.call_tuple() an perl.callm_tuple().
Perl ref object
Reference to perl objects (as returned by perl.get_ref() or passed to python as function arguments or return values) are wrapped up in a python extention type called perl ref object
. The main purpose of these objects are to wrap arbitrary perl data such that it can be hold by python and passed back into perl at some later time. In the same way python objects passed to perl are wrapped up as Python::Object
.
The perl ref object
wrapper also provide behaviour that make the perl objects conform to the various interfaces that the corresponding python data type provide. This make it possible to use perl data mostly transparently in existing python code.
The following special attributes are supported by perl ref object
s.
- p.__class__
-
This attribute denote the name of the class that the object is blessed into. Perl objects can be blessed from python by assignment to the
__class__
attribute. A value ofNone
denotes an unblessed object. - p.__type__
-
This read-only attribute denote the type of the perl object. It is a string like "SCALAR", "ARRAY", "HASH" or "CODE".
The perl builtin ref() function can be defined in python like this:
def ref(o): return o.__class__ or o.__type__
- p.__value__
-
This attribute is only present for references to perl scalars. It is used to dereference the scalar reference. Example:
pid = perl.get_ref("$$") print pid.__value__
- p.__wantarray__
-
This attribute denoted the default context that is used if the object is called. A value of
None
denotes void context. A TRUE value denotes list context and a FALSE value denote scalar context. The default is0
, i.e. scalar context. - p.__methodname__
-
All
perl ref object
can be assossiated with a method name. If the object is called and this attribute is set, then we will try to call the correspondigly called perl method on the wrapped up perl object. - p.foo
-
Access to any other attribute will return a new
perl ref object
that wraps the same underlying perl object, but which has the__methodname__
attribute initialized to the attribute name. The result of this is simply that:p.foo()
works as expected. The value of
__wantarray__
will be inherited by the new wrapper. - p.foo_tuple
-
If an attribute with the suffix
_tuple
is read, then a method wrapper is created with the__wantarray__
attribute set to a TRUE value.
A perl array wrapped up as a perl ref object
support the following methods and operators that make it compatible with python lists:
- array.append(object)
-
Appends a new element to the end of the array. Same as perl's push(@array, $object)
- array.insert(index, object)
-
Insert a new element at the indicated position in the array. Similar to perl's splice(@array, $index, 0, $object)
- array.extend(seqence)
-
Appends the elements a the sequence to the end of the array. Same as perl's push(@array, @sequence)
- array.pop()
-
Removes the last element from the array and returns it. Same as perl's pop(@array)
- array.pop(index)
-
Removes the element with the indicated index from the array and returns it. Same as perl's splice(@array, $index, 1)
- array.remove(object)
-
Searches for the given object in the array and removes first occurence if found. Raises an exception if no matching element is found.
- array.index(object)
-
Searches for the given object in the array and returns the index to the first occurence found. Raises an exception if no matching element is found.s
- array.count(object)
-
Returns the number of occurences of the given object in the array. Similar to perl's scalar(grep $_ eq $object, @array).
- array.reverse()
-
Reverse sequence of the elements of the array in-place. Return None.
- array.sort()
-
Not implemented yet.
- array[i]
-
Arrays can be indexed in the natural way. Reference to out of bounds indexes raise an
IndexError
exception.This automatically also enables various operations like:
x in array x not int array min(array) max(array) for x in array: ... map(foo, array) reduce(foo, array) filter(foo, array)
- array[low:high]
-
Slicing and assigment to slices are supported for arrays.
- del array[i]
- del array[low:high]
- array + array
-
Arrays can be concatenated with the "+" operator.
- array * i
-
Arrays can be repeated with the "*" operator.
A perl hash wrapped up as a perl ref object
support the following methods that make it compatible with python dictionaries. Note that the key
argument of perl hashes must be strings. A TypeError
exception is raised if non-string keys are used.
- hash.has_key(key)
-
Check if the hash has the key. Same as perl's exists $hash{$key}.
- hash.keys()
-
Returns a list of all keys. Same as perl's keys %hash.
- hash.values()
-
Returns a list of all values. Same as perl's values %hash.
- hash.items()
-
Returns a list of (key, value) tuples.
- hash.clear()
-
Removes all elements from the hash.
- hash.copy()
-
Creates a new hash with the same elements and return it.
- hash.update(mapping)
-
Updates hash with content of other mapping object.
- hash.get(key)
-
Returns hash[key] if any value with the given key exists,
None
otherwise.==item hash.get(key, default)
Returns hash[key] if any value with the given key exists,
default
otherwise. - hash[key]
-
Specific hashes values can be read or assigned to using subscription syntax. Reading a non-existing key raise an
KeyError
exception. - del hash[key]
-
Hash elements can be removed with the 'del' operator.
Other features of all perl ref objects are:
- p(...)
-
Perl ref objects can be called. If the
__methodname__
attribute is set, then this will try to call the given method with the wrapped perl reference as the object. If the wrapped perl object is CODE, then it is called. - str(p)
-
Perl ref objects stringify as a string on the following form:
<perl Foo=HASH(0x80db1e0) ref at 810fff0>
This shows a wrapper around a HASH blessed into the "Foo" package.
- repr(p)
-
Same as str() currently.
- len(p)
-
For arrays and hashes this return the size. For all other things it will raise a TypeError exception.
- if p: ...
-
Empty arrays and hashes evaluate to a false value in boolean contexts. Every other object will be TRUE.
Exceptions
If a perl exception is raised, and caught in python then the exception type object will be perl.PerlError
and the value will be the stringified stuff from $@
.
BUGS
Perl call frames are currently invisible in python tracebacks.
COPYRIGHT
(C) 2000-2001 ActiveState
This code is distributed under the same terms as Perl; you can redistribute it and/or modify it under the terms of either the GNU General Public License or the Artistic License.
THIS SOFTWARE IS PROVIDED BY ACTIVESTATE `AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ACTIVESTATE OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.