[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#19643: 24.2; shell mode
From: |
Eli Zaretskii |
Subject: |
bug#19643: 24.2; shell mode |
Date: |
Wed, 21 Jan 2015 17:49:54 +0200 |
> From: twilliam@twilliam.org
> Date: Tue, 20 Jan 2015 17:12:31 -0700
>
> I'm trying to use shell mode. In fact, I'm trying to run a Perl
> program in shell mode. I launch the program, and it runs. Input from
> a file is read, processed. Output (to STDOUT) is printed to *shell*.
> Trouble is I can't read keyboard input (as in <STDIN>). What am I
> missing (except a brain)?
>
> Ok, this is Emacs 24.2.1 running on Windows XP.
>
> I downloaded Perl from ActiveState in 2011. Here's a simple Perl
> program that demos the problem:
>
> print "Give me a number: ";
> chomp ( $Anumber = <STDIN> );
> print "Give me another: ";
> chomp ( $Bnumber = <STDIN> );
> $product = $Anumber * $Bnumber;
> print "$Anumber times $Bnumber = $product\n";
>
> It works fine in a DOS window. In emacs shell mode it tells me this
>
> Use of uninitialized value $Anumber in chomp at c:\Perl\ex2-4.pl line 3.
> Use of uninitialized value $Bnumber in chomp at c:\Perl\ex2-4.pl line 5.
> Use of uninitialized value $Bnumber in multiplication (*) at c:\Perl\ex2-4.pl
> line 6.
> Use of uninitialized value $Anumber in multiplication (*) at c:\Perl\ex2-4.pl
> line 6.
> Use of uninitialized value $Anumber in concatenation (.) or string at
> c:\Perl\ex2-4.pl line 7.
> Use of uninitialized value $Bnumber in concatenation (.) or string at
> c:\Perl\ex2-4.pl line 7.
> Give me a number: Give me another: times = 0
>
> Perl is complaining about uninitialized values before it has even
> printed the prompts for them.
It's a buffering issue. On Windows, sub-processes are run via pipes,
and Perl evidently fully buffers its stdout when it's connected to a
pipe (as opposed to a console, where it is line-buffered, and is also
flushed when your script reads from STDIN). There's nothing Emacs can
do about this, because the decision about the buffering mode is made
by the Perl interpreter.
Some interpreters, like Python, have a command-line switch to turn off
buffering, but Perl doesn't (AFAIK). So you need to do that from your
Perl scripts.
My Perl is exceedingly rudimentary, but I found the solution here:
http://perl.plover.com/FAQs/Buffering.html
http://www.perlmonks.org/?node_id=280025
The solution is to add this single line at the beginning of your Perl
script:
$|++;
This causes STDOUT to auto-flush after each output.
(There's also an alternative that needs to use the FileHandle module,
see the first URL above.)
Bottom line: I don't think this is an Emacs problem.