func (p *Purl) Eval(src string) string {
	csrc := C.CString(src)
	defer C.free(unsafe.Pointer(csrc))
	cres := C.EvalPerl(csrc)
	if cres == nil {
		return ""
	}
	return C.GoString(cres)
}
Eval evaluates Perl code.

Interpreter state is persisted until Destroy is called.
package perl
import "C"
import (
	"sync"
	"unsafe"
)
var perlMutex sync.Mutex
var xsMap = make(map[string]*func(...string) string)
var dummySVPtr *C.SV
var svPtrSize = unsafe.Sizeof(dummySVPtr)
type Purl struct {
	init    bool
	destroy bool
}
func (p *Purl) Init() {
	perlMutex.Lock()
	if !p.init {
		C.PurlInit()
		p.init = true
		p.destroy = false
	}
	perlMutex.Unlock()
}
func (p *Purl) Destroy() {
	perlMutex.Lock()
	if !p.destroy {
		C.PurlDestroy()
		p.destroy = true
		p.init = false
	}
	perlMutex.Unlock()
}
func (p *Purl) RegisterXS(name string, f func(...string) string) {
	xsMap[name] = &f
	p.Eval(`
package main {
	*{"` + name + `"} = sub { Purl::XS->Invoke("` + name + `", @_) };
}
`)
}