http://www.perlmonks.org?node_id=1046546

ravi6289 has asked for the wisdom of the Perl Monks concerning the following question:

Hello everybody ,, I'm a beginner in perl .I'm having a small problem with my code :
$|=1; my $myohmy : shared = 1; print "Checking .."; $thr = threads->create(\&checkdot)->detach; $thr1 = threads->create(\&psou); $thr1->join(); $myohmy = 0; sub checkdot { $|++; while ( $myohmy == 1 ) { print "."; sleep 1; } } ###### above code not relevant ##### sub psou { open (PS, "$psout |"); #### $psout is the command ####### } while (<PS>) ####### PROBLEM -> No output here #### { ..

######## It is here the problem occurs ,, the filehandle PS is not visible , I'm pretty sure it's a scoping problem , because when the "open" statement is outside the subroutine, the code after "while" works . I have also tried creating a global variable , and with the three argument open , but it doesn't work . Could you please suggest me as to how I can fix this #############

Replies are listed 'Best First'.
Re: FILEHANDLE not visible outside subroutine
by choroba (Cardinal) on Jul 26, 2013 at 16:11 UTC
    You should always check the return value of open:
    open PS, "$psout |" or die $!;

    Update: Also, it seems you are running the sub in a thread. Why do you think a filehandle would be shared?

    لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
      Hello choroba ,, I'm sure the open statement returns just fine ,. Although , I was not aware filehandles could not be shared in threads (newbie :/) , thank you so much for pointing that out . I have modified the code to avoid the filehandle statement , and used a shared variable to store the command output , it works great !! .. Thanks again ... :)