# The following was supposedly scribed by
# Sisyphus
# on Monday 22 March 2004 09:31 pm:
|use warnings;
|
|BEGIN {
| eval{require Inline::C};
| if($@) {
| print "No Inline::C here\n";
| # do whatever you want
| exit;
| }
| }
|
|use Inline C => <<'EOC';
|
|void got_it() {
| printf("We have Inline::C\n");
| }
|
|EOC
|
|got_it();
|
|__END__
|
|Seems to work as you want. As it is it prints "We have Inline::C". If I
|change all occurrences of 'Inline::C' (and 'Inline C') to 'Inline::D'
|(and 'Inline D') then it prints "No Inline::D here" and quietly exits.
Sounds about right, except I think the OP wanted to do something besides exit
if Inline::C is not available. Usually, you would have a require() statement
for this sort of thing, since those don't get caught at compile time (trouble
with use() is that the interpreter wil find it anywhere.)
This won't work:
require Inline C => <<'EOC';
So, you would have to call the import routine directly:
BEGIN {
eval{require Inline::C};
if($@) {
print "No Inline::C here\n";
# do whatever you want
exit;
}
else {
Inline::import(Inline, C => <<'EOC'
void got_it() {
printf("we have inline::C\n");
}
EOC
);
}
}
Example: you've written a function (or class) in both C and Perl, and the C
one is faster, but you want the Pure Perl one to be available as a fallback.
You could also put the 'use Inline C => $code' line inside of an eval, or
(maybe a better plan) write two modules and do an eval {require } on each in
turn. The one which contains 'use Inline::C' will fail the require, so you
can fall-back on the pure-perl one in an else{} block.
Of course, as Rob has demonstrated, you need to do all of this fancy stuff in
a BEGIN block.
--Eric