Using IDL from a perl script

J

James Everton

Hi everybody,

I'm developing some web scripts in perl that interact with a database
through various pre-written IDL procedures here at my work. The
problem I'm having is getting arguments passed between the two.
Passing from the perl into the IDL code is easy enough because I'm
using the open( ) procedure and simply writing the strings as a block:

open(IDL, "|/usr/local/bin/idl -32");
print IDL <<"ENDIDL";
var1 = '$myPerlVar1'
var2 = '$myPerlVar2'
..compile my_web_script
my_web_script, var1, var2
ENDIDL

I'm wondering if there is any way to pass from this IDL block (say for
instance that the my_web_script procedure was actually a function and
was assigned to a new variable returnVar) out to the containing perl
script. For those that don't know IDL, I'm quite certain that you can
do this exact same open-block style with any other script, like bash
for example, so it really might be more of a direct perl question.

Any insights would be greatly appreciated.
Thanks,
- James Everton
 
M

Michele Dondi

open(IDL, "|/usr/local/bin/idl -32");
print IDL <<"ENDIDL";
var1 = '$myPerlVar1'
var2 = '$myPerlVar2'
.compile my_web_script
my_web_script, var1, var2
ENDIDL

I'm wondering if there is any way to pass from this IDL block (say for
instance that the my_web_script procedure was actually a function and
was assigned to a new variable returnVar) out to the containing perl
script. For those that don't know IDL, I'm quite certain that you can

IPC::Open{2,3}


Michele
 
A

A. Sinan Unur

I'm developing some web scripts in perl that interact with a database
through various pre-written IDL procedures here at my work. The
problem I'm having is getting arguments passed between the two.
Passing from the perl into the IDL code is easy enough because I'm
using the open( ) procedure and simply writing the strings as a block:

open(IDL, "|/usr/local/bin/idl -32");
print IDL <<"ENDIDL";
var1 = '$myPerlVar1'
var2 = '$myPerlVar2'
.compile my_web_script
my_web_script, var1, var2
ENDIDL

Instead of typing the code yourself, you are having perl type the code.
This is not what I understand from "passing arguments".
I'm wondering if there is any way to pass from this IDL block (say for
instance that the my_web_script procedure was actually a function and
was assigned to a new variable returnVar) out to the containing perl
script.

There is a serious disconnect in your thinking here. You just opened a
write-only pipe to the /usr/local/bin/idl process. Even if you could
pass some return values (by having the IDL script throw an error), it
would be cumbersome.

Maybe perldoc perlipc can help but you need to improve your
understanding of how interprocess communications work. Why are you
writing the script above? Why wouldn't you just type your IDL program in
an editor rather than generating these scripts using Perl?

Sinan
 
J

jkj

Hi everybody,

I'm developing some web scripts in perl that interact with a database
through various pre-written IDL procedures here at my work. The
problem I'm having is getting arguments passed between the two.
Passing from the perl into the IDL code is easy enough because I'm
using the open( ) procedure and simply writing the strings as a block:

I've done this a bunch and found it to be very useful... here's a bit
more of what I find works:

use IPC::Open2;

$progName = "idl";
open2(READIDL, WRITEIDL, $progName) or die "Could not begin \"$progName
\"\n";

# Then you can cause IDL to execute commands like this:
print WRITEIDL "value = 13\n";

# I find that output coming back from IDL is cluttered, so before
# asking IDL to return a value I ask it to spit out "junk":
print WRITEIDL "print, \"junk\"\n";
while(!(<READIDL> =~ /junk/)){
}

# Now I can get the value I want back asking IDL to output it:
print WRITEIDL "print, value\n";
$value = <READIDL>;
chomp($value);

....hope that helps,
-Kevin
 
J

James Everton

I've done this a bunch and found it to be very useful... here's a bit
more of what I find works:

use IPC::Open2;

$progName = "idl";
open2(READIDL, WRITEIDL, $progName) or die "Could not begin \"$progName
\"\n";

# Then you can cause IDL to execute commands like this:
print WRITEIDL "value = 13\n";

# I find that output coming back from IDL is cluttered, so before
# asking IDL to return a value I ask it to spit out "junk":
print WRITEIDL "print, \"junk\"\n";
while(!(<READIDL> =~ /junk/)){

}

# Now I can get the value I want back asking IDL to output it:
print WRITEIDL "print, value\n";
$value = <READIDL>;
chomp($value);

...hope that helps,
-Kevin

Thanks so much! Took me a while to get a feel for how the handles
were being set up, but it worked like a charm!
As for the IDL junk, I found that setting my $progName to 'idl &> /dev/
null' got rid of all the junk as well as compilation print outs.

Pipes are your friend :)
- James
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,236
Members
46,825
Latest member
VernonQuy6

Latest Threads

Top