<?xml version="1.0" encoding="windows-1252"?>
<node id="391245" title="nested Safe-&gt;reval and method from custom Module" created="2004-09-15 13:11:25" updated="2005-03-21 18:23:23">
<type id="115">
perlquestion</type>
<author id="314530">
jeremyh</author>
<data>
<field name="doctext">
Hello Monks,
&lt;br&gt;&lt;br&gt;
I'm using Safe-&gt;reval to check if a generated perl expression is true. &lt;br&gt;

I want to allow that perl expression to use a method from a custom perl module. &lt;br&gt;
This method also uses Safe-&gt;reval (in a new compartment). &lt;br&gt;
I can't get the nested reval to work (it works fine if called directly). &lt;br&gt;
&lt;br&gt;
Here is the code:
&lt;br&gt;
&lt;br&gt;The method in the custom module WOU_Util
&lt;br&gt;
&lt;code&gt;
my $compartment = new Safe;  # module level

$compartment-&gt;permit(qw());  # module level

sub date_compare {
    my ($date, $op, $refdate) = @_;

    my ($mm_date, $dd_date, $yyyy_date) = split(/\//, $date);
    my ($mm_ref, $dd_ref, $yyyy_ref) = split(/\//, $refdate);

    my $date_str = $yyyy_date . $mm_date . $dd_date;
    my $ref_str  = $yyyy_ref  . $mm_ref  . $dd_ref;

    $compartment-&gt;reval( qq{
        ($date_str $op $ref_str) || return 0;

         # fall-through
         return 1;
    } );
}
&lt;/code&gt;
&lt;br&gt;
&lt;br&gt;
And here's some test code that calls the method:
&lt;br&gt;
&lt;code&gt;
#!/usr/bin/perl -w

use strict;
use Safe;
use WOU_Util;

my $compartment = new Safe;


$compartment-&gt;share_from('WOU_Util', [ 'date_compare' ] );
$compartment-&gt;permit( qw() );
  
my ($date1, $op, $date2);

$date1 = '01/02/2004';
$date2 = '01/01/2004';
$op    = 'gt';

# this prints
$compartment-&gt;reval( "print 'greater' if \"$date1\" $op \"$date2\"" );

$op = '&gt;';
# this doesn't print, throws error
$compartment-&gt;reval( "print 'greater' if date_compare(\"$date1\",\"$op\",\"$date2\")" );
&lt;/code&gt;
&lt;br&gt;
&lt;br&gt;
The error is:
&lt;br&gt;
Use of uninitialized value in null operation at /usr/lib/perl5/5.6.1/i386-linux/Safe.pm line 222.&lt;br&gt;
        (in cleanup) Undefined subroutine &amp;Safe::Root0:: called at /usr/lib/perl5/5.6.1/i386-linux/Safe.pm line 222.
</field>
</data>
</node>
