all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Eli Zaretskii <eliz@gnu.org>
To: twilliam@twilliam.org
Cc: 19643@debbugs.gnu.org
Subject: bug#19643: 24.2; shell mode
Date: Wed, 21 Jan 2015 17:49:54 +0200	[thread overview]
Message-ID: <83bnlsw2u5.fsf@gnu.org> (raw)
In-Reply-To: <83vbk1htzk.fsf@WILLIAM.i-did-not-set--mail-host-address--so-tickle-me>

> 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.





  parent reply	other threads:[~2015-01-21 15:49 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-01-21  0:12 bug#19643: 24.2; shell mode twilliam
2015-01-21  4:15 ` Alexis
2015-01-21 15:49 ` Eli Zaretskii [this message]
2015-01-24 16:45 ` bug#19643: Emacs shell mode problem twilliam
2015-01-25 16:20   ` Eli Zaretskii

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=83bnlsw2u5.fsf@gnu.org \
    --to=eliz@gnu.org \
    --cc=19643@debbugs.gnu.org \
    --cc=twilliam@twilliam.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.