Программа, о которой я говорю, является второй программой, показанной в этом разделе здесь . Его небольшая модификация:
#!/usr/bin/perl -w
use IPC::Open2;
use Symbol;
$WTR = gensym(); # get a reference to a typeglob
$RDR = gensym(); # and another one
$pid = open2($RDR, $WTR, 'bc');
print "$pid\n";
while (<STDIN>) { # read commands from user
print $WTR $_; # write a command to bc(1)
$line = <$RDR>; # read the output of bc(1)
print STDOUT "$line"; # send the output to the user
}
Эта программа работает нормально. Скажем, его имя - prop_7_2_39_2.pl, поэтому типичное взаимодействие с ним:
>./prop_7_2_39_2.pl
75955
2+2
4
quit
>
То есть после ввода «quit» дочерний процесс bc
перестает функционировать, и после этого мне нужно кормить новая строка, чтобы фактически завершить sh родителя perl. Почему <STDIN>
оценивается как ложное? Я понимаю, что perl оценивает определение <STDIN>
. Несколько родственная программа
#!/usr/bin/perl -w
while(<STDIN>){}
не заканчивается.