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

You'll need to have a wide terminal to see the effect I am seeing.

Mine is set to 1000 chars wide with tab stops the typical every 8 characters, but when I execute the following code, columns 13, 14 & 15 (char offset 98+) are displayed as if the tab stops at the first of those three positions was every 4 chars. Is this Perl's doing or a peculiarity of my terminal?

print join ' ', ('123456789') x 20; print join "\t", ('xx') x 50;; 123456789 123456789 123456789 123456789 123456789 123456789 123456789 xx xx xx xx xx xx xx xx xx 123456789 123456789 123456789 123456789 123456789 123456789 xx xx xx xx xx xx xx xx xx ...........................^...^...^

Perhaps even weirder, the pattern of 3 grouping occurs recurrently at intervals across the screen, but the intervals are not regular. Then next occurance is at 39, 40 & 41 (char offset 297+). The one after at 65, 66 & 67 (497+).

I keep looking for a pattern in either the tab stop numbers or char offset numbers, but if there is one, it's eluding me?


Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
"Too many [] have been sedated by an oppressive environment of political correctness and risk aversion."

Replies are listed 'Best First'.
Re: Perl or my terminal?
by shmem (Chancellor) on Jun 24, 2007 at 05:41 UTC
    Must be your terminal. My X-terminal gets the tabstops right, with your code.

    --shmem

    _($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                                  /\_¯/(q    /
    ----------------------------  \__(m.====·.(_("always off the crowd"))."·
    ");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}

      Which is really weird, cos I don't see the same effect when I run the following D code:

      import std.file; int main( char[][] args ) { for( int i=0; i<99; i++ ) printf( "123456789 " ); printf( "\n" ); for( int i=0; i<125; i++ ) printf( "xx\t" ); printf( "\n" ); return 0; }

      Nor the equivalent C code:

      #include <stdlib.h> int main( int argc, char **argv ) { int i; for( i=0; i<99; i++ ) printf( "123456789 " ); printf( "\n" ); for( i=0; i<125; i++ ) printf( "xx\t" ); printf( "\n" ); return 0; }

      Nor this version of the perl code:

      for( $i=0; $i<99; $i++ ){ printf( "123456789 " ) } printf( "\n" ); for( $i=0; $i<125; $i++ ){ printf( "xx\t" ) } printf( "\n" );;

      It only seems to happen when I use:

      print join ' ', ('123456789') x 99; print join "\t", ('xx') x 125;;

      Which makes about as much sense as a chocolate teapot?


      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.
        The only difference I see between your original perl version and other languages is that in the latter you loop, while in the former you output each line as one string. Could that be the reason? e.g. 512 byte boundary or such?

        What happens if you redirect the output of each version into files? are they different?

        --shmem

        _($_=" "x(1<<5)."?\n".q·/)Oo.  G°\        /
                                      /\_¯/(q    /
        ----------------------------  \__(m.====·.(_("always off the crowd"))."·
        ");sub _{s./.($e="'Itrs `mnsgdq Gdbj O`qkdq")=~y/"-y/#-z/;$e.e && print}