I would like to run a perl program from my Allegro PCB Skill code.
I have skill code like belowprocedure(test() cid=ipcBeginProcess("perl C:/test.pl") ipcReadProcess(cid 5) )
The perl program(test.pl) is reading data/values from text files containing multiple lines and printing out values using foreach loop(till EOF)
I would like to have some kind of blocking method to pass the values to skill code one at a time(and then returning to perl to run next) so as to manupulate in skill.
You could just use parseString() on the result of ipcReadProcess - e.g. parseString(ipcReadProcess(cid 5) "\n") to split the strings on the carriage return. Other than that you'll have to create some kind of handshaking protocol between the two - and make sure you flush the output in perl after writing each line. By handshaking I mean you'd have to read a line in SKILL, and then send a message back using ipcWriteProcess, and have your perl script wait until it gets the message back before writing the next string.
It's not that clear what you really want to do here or why it needs to do this one at a time. In fact if you only want to read the file and print it out, just doing printf("%s" ipcReadProcess(cid 5)) would be sufficient. So you could do:
procedure(test() cid=ipcBeginProcess("perl C:/test.pl") ipcWaitForProcess(cid) while(ipcIsAliveProcess(cid) printf("%s" ipcReadProcess(cid 5)) ))
BTW - not sure why you posted this in the Custom IC SKILL forum if you're using Allegro SKILL - there's a PCB SKILL forum which would be more appropriate. However, the code above should work in both Virtuoso and Allegro environments, I believe.
I am trying to run a perl script in skill through CIW. I am using ipcBeginProcess("perl filename.pl").Please post the procedure to execute the perl script in skill and see the results.
Normally perl scripts have buffered output, which tends to mean that you wouldn't see any output until perl's output buffer fills up (1024 chars, I think). So I used this example "nobuf.pl" to illustrate how to change that:
$|=1;print "now you see it...";sleep 10;print "now you don't...";
The "$|" bit is the key to making the output unbuffered.
procedure(CCFprintOutput(cid data) printf("RECEIVED at %s: %s\n" getCurrentTime() data))
procedure(CCFprogramFinished(cid status) printf("FINISHED at %s with exit status %d\n" getCurrentTime() status))
ipcBeginProcess("perl nobuf.pl" "" 'CCFprintOutput 'CCFprintOutput 'CCFprogramFinished)
From which I got:
RECEIVED at Apr 26 20:12:12 2014: now you see it...RECEIVED at Apr 26 20:12:22 2014: now you don't...FINISHED at Apr 26 20:12:22 2014 with exit status 0
If I had run the command for "buf.pl" which is identical except for omitting the first line (the $| statement), I got a 10 second delay and then:
RECEIVED at Apr 26 20:15:11 2014: now you see it...now you don't...FINISHED at Apr 26 20:15:11 2014 with exit status 0
Of course, this example is showing asynchronous communication. It's also possible to just do:
ipcId=ipcBeginProcess("perl nobuf.pl")ipcWaitForProcess(ipcId)ipcReadProcess(ipcId 30) =>"now you see it..."ipcReadProcess(ipcId 30) => "now you don't..." (after a delay)ipcIsAliveProcess(ipcId) => nil
If you want synchronous communication. The 30 is a timeout in case the child process doesn't respond.
Hope that helps!
It's been great help. Thanks a lot.