sendu has asked for the wisdom of the Perl Monks concerning the following question:
I'm stuck trying to figure out why my usage of IPC::Open2 isn't working how I expect.
This works:
perl -e 'package MyPack; sub foo { use IPC::Open2; my ($in, $out); my $pid = open2($out, $in, q[program --unbuffered]); print $in q|some json|; my $result = <$out>; warn "got [$result]\n"; close($in); close($out); waitpid($pid, 0); } 1; package Main; MyPack->foo();'
It prints my expected result in square brackets after taking some time to calculate the result.
But if I have lib/MyPack.pm:
package MyPack; sub foo { use IPC::Open2; my ($in, $out); my $pid = open2($out, $in, q +[program --unbuffered]); print $in q|some json|; my $result = <$out>; + warn "got [$result]\n"; close($in); close($out); waitpid($pid, 0); } 1;
and do:
perl -Ilib -MMyPack -e 'MyPack->foo();'
It returns immediately with an empty result set (json empty square brackets inside my printed square brackets). foo() in both cases is copy/pasted. Why doesn't it work from inside a .pm?
Edit for more: Fully copy/pasting the entire contents of the perl 1 liner that works in to lib2/MyPack.pm, and then calling:
perl -Ilib2 -e 'use MyPack;'
also doesn't work. What can it be about having the code inside a .pm that could stop it working?
Edit for solution: my input json string had single quotes, which behaved differently on the command line and inside a .pl or .pm. Removing the quotes made them both behave the same.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Why is IPC::Open2 behaving differently in a .pm?
by shmem (Chancellor) on Aug 14, 2015 at 16:26 UTC | |
by sendu (Initiate) on Aug 17, 2015 at 09:48 UTC | |
by tye (Sage) on Aug 17, 2015 at 14:35 UTC | |
by sendu (Initiate) on Aug 17, 2015 at 15:40 UTC |