At one site one needs to write script B which does what A does but has a different interface incompatible with the one of A (in my case it must be an Asterisk AGI script).
Refactor? Nah, that's for wimps. Call A from B as a subshell? Suboptimal, for wimps only.
We need to go old skool and do. Never heard of perl-do? Not-for-the-faint-hearted.
Bad news: A calls exit(1) in multiple places. That bombs B as well. Two things to do: use $SIG{__DIE__} [doesn't work satisfactorily] or overload exit:
-ulianov#!/usr/bin/perl use strict; use warnings; use Asterisk::AGI; push @INC => '/root'; # A.pl needs this :( my $AGI = new Asterisk::AGI; my %input = $AGI->ReadParse(); $ARGV[0] = $input{callerid}; # fake passing args using command line my $canada; eval { no warnings; local *CORE::GLOBAL::exit = sub { my $excode = shift; $AGI->noop("Exit code was $excode"); $canada = !int($excode); goto out; # A.pl calls the overloaded exit twice w/o this (!!) }; -r '/root/A.pl' or $AGI->noop("Cannot read A.pl: $!"); $AGI->noop("do() FAILED $@ - $!") unless do '/root/A.pl'; }; out: $AGI->set_variable('RESULT', $canada? 'YES': 'NO'); 0;