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

I want to print the record count to the command line in DOS I don't want it to roll like each number has a newline in it. The code is something like this.
open (XMLFILE,"exportB.xml") || die "Can't open export.xml file :$!\n" +; while(<XMLFILE>){ $ctr++; # do something here ... print $ctr;

Replies are listed 'Best First'.
Re: print to command line
by Paladin (Vicar) on May 12, 2005 at 16:36 UTC
    Try somthing like this:
    while (<XMLFILE>) { # ... do stuff ... print "\cM"; print $ctr; }
    The \cM will print a CR which brings the cursor back to the start of the line, allowing the next print statement to print over it.
Re: print to command line
by ikegami (Patriarch) on May 12, 2005 at 16:39 UTC

    If I understand correctly, you want something like:

    print("\rProcessed line number $ctr.");

    Test code:

    for $ctr (1..10) { sleep(1); print("\rProcessed line number $ctr."); } print("\rDone. \n");

    Similar to how "\n" (Line Feed) moves the cursor to the begining of the next line, "\r" (Carriage Return) moves the cursor to the begining of the current line.

Re: print to command line
by ww (Archbishop) on May 12, 2005 at 17:10 UTC
    Based on an alternate guess that what you want might be to output the numbers of the lines you've processed into a reasonably visible block, thusly:
    0  1  2  3  4  5  6  7  8  9  10  11
    12  13  14  15  16  17  18  19  20  21  22  23
    24  25  26  27  28  29  30  31  32  33  34  35
    36  37  38  39  40  41  42  43  44  45  46  47
    48  49  50  51  52  53  54  55  56  57  58  59
    60  61  62  63  64  65  66  67  68  69  70  71
    72  73  74  75  76  77  78  79  80  81  82  83
    84  85  86  87  88  89  90  91  92  93  94  95
    96  97  98  99  100  101  102  103  104  105  106  107
    108  ....
    

    you'll have to decide how wide you want to go on your particular DOS screen, and then use a second counter to hold the output to the width you want.

    That's done indirectly, below: maxing $ctr2 at 12 means the lines of (3 digit) numbers will be not more than 62 chars wide, which should be visible_at_a_glance on any screen that I consider likely.

    $ctr2=0; for ($ctr = 0; $ctr < 180; ++$ctr) # 180 arbitrary { print "$ctr "; # val followed by two spaces $ctr2++; # flag if ($ctr2 == 12) { print "\n"; $ctr2 = 0; } } exit;
    But for your next question, you'll get a more concise answer set, quicker, if you save us guessing your intent. Show some input; show what you hope/expect your output to be... and, for good measure, try to demonstrate some effort with code rather than "do something here.."

    and please, though your code in this one was not hard to decipher, use <code> ... <\code> tags around code.

    hth
Re: print to command line
by cog (Parson) on May 12, 2005 at 16:48 UTC
      OTOH... just cause you can use a flag doesn't mean you always should: 433667
Re: print to command line
by davidrw (Prior) on May 12, 2005 at 16:41 UTC
    If the "do something" is simple, could just use a one-liner like:
    perl -ne " do_stuff() ; print $. . ' '" exportB.xml
    Otherwise, your loop seems fine (you could still use $. instead, which shows the current input record number, of $ctr if you wanted -- see perlvar man page for details).

    As long as $ctr or whatever you print doesn't have a newline in it, it should "roll" the way you want. In my example above i separated each print with a space.

    side note -- what's the nature of "do something here"? read: is this something more suited for XML::Simple or the like?