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

Hi I like to how can I display a string in a single line that replaces the previous string. The output that I want to achieve is something like this,
"printing string one" <--output in the command line
where "one" will be replaced by a diffrent string and not adding another line which looks like this,
"printing string one" "printing string two" "printing string three"
I ask this question because I have a program which process files in a drive/directory and prompt user which file it is currently processing. Problem is it displays too much line in the command line which is very confusing when processing large quantity of files. Any ideas how to achieve this? Thanks..

Replies are listed 'Best First'.
Re: Print string in same line
by ikegami (Patriarch) on Jul 23, 2008 at 08:52 UTC
    use IO::Handle; for (1..3) { print("\r$_"); STDOUT->flush(); sleep(1); } print("\n");
    or
    use IO::Handle; STDOUT->autoflush(1); for (1..3) { print("\r$_"); sleep(1); } print("\n");

    Update: Forgot the \r! Fixed.

      Well, that should work, basically, for strings of non-decreasing length.

      If the OP expects that some of the strings to print may decrease in length, then saving the length, so that an appropriate number of spaces can be added to shorter strings to wipe out the prior longer string, could be helpful.

      Further, depending on the terminal (or console window) type, if the string exceeds the terminal's line width, there may be some wrap-around that is not recoverable, except via curses (Unix) or some other OS-specific facilities. If the OP expects that some of the lines may exceed the line width of the terminal, then some method of abbreviating the line, showing the most important data, and staying within the line width, could be helpful.

        If the OP expects that some of the strings to print may decrease in length, then saving the length, so that an appropriate number of spaces can be added to shorter strings to wipe out the prior longer string, could be helpful.

        Just change the print statement to print("\e[1K\r$_");

        As to showing the most important data the OP should take care of formating the line to show what matters. Still, if there is wrapping around, one possible approach is to clear the screen and reprint. An example:

        use strict; use warnings; my @a=("qwert","as","z"); $| = 1; for (0..2) { print "\e[1J\e[H"; print"$a[$_]"x100; sleep(1); } print "\n";

        legend:

        \e[1K - clear from cursor to beginning of the line \r - goto beginning of the line \e[1J - clear from cursor to beginning of the screen. \e[H - Moves the cursor to top left corner
        You're right, So what I did is get the difference (if there are any) of the number of characters of the previous string to the next to identify the number of spaces to be added in the shorter strings...
      Thanks ikegami for the immediate response, this is exactly what I'm looking for.