Hello Monks,
I'm using Safe->reval to check if a generated perl expression is true.
I want to allow that perl expression to use a method from a custom perl module.
This method also uses Safe->reval (in a new compartment).
I can't get the nested reval to work (it works fine if called directly).
Here is the code:
The method in the custom module WOU_Util
my $compartment = new Safe; # module level
$compartment->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->reval( qq{
($date_str $op $ref_str) || return 0;
# fall-through
return 1;
} );
}
And here's some test code that calls the method:
#!/usr/bin/perl -w
use strict;
use Safe;
use WOU_Util;
my $compartment = new Safe;
$compartment->share_from('WOU_Util', [ 'date_compare' ] );
$compartment->permit( qw() );
my ($date1, $op, $date2);
$date1 = '01/02/2004';
$date2 = '01/01/2004';
$op = 'gt';
# this prints
$compartment->reval( "print 'greater' if \"$date1\" $op \"$date2\"" );
$op = '>';
# this doesn't print, throws error
$compartment->reval( "print 'greater' if date_compare(\"$date1\",\"$op
+\",\"$date2\")" );
The error is:
Use of uninitialized value in null operation at /usr/lib/perl5/5.6.1/i386-linux/Safe.pm line 222.
(in cleanup) Undefined subroutine &Safe::Root0:: called at /usr/lib/perl5/5.6.1/i386-linux/Safe.pm line 222.
Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
Read Where should I post X? if you're not absolutely sure you're posting in the right place.
Please read these before you post! —
Posts may use any of the Perl Monks Approved HTML tags:
- a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
| |
For: |
|
Use: |
| & | | & |
| < | | < |
| > | | > |
| [ | | [ |
| ] | | ] |
Link using PerlMonks shortcuts! What shortcuts can I use for linking?
See Writeup Formatting Tips and other pages linked from there for more info.