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

I've stumbled upon something in the interpreter that I don't understand. While debuging a loop I added the following debug statement to see what was going on

warn "row=$row col=$col row->[col]=", $row->[$col], ";\n";

Fairly dull stuff, but I noticed that one of these debug lines was printed twice, and the first of the two lines had a ' (#1)' suffix tacked on the end. Correction: after the semicolon, but before the \n so it isn't quite the end but very close. As only one line out of hundreds had this, I was confused. Here is what I was seeing:

row=ARRAY(0x98e2c20) col=0 row->[col]=-output_format; row=ARRAY(0x98e2c20) col=1 row->[col]=csh; row=ARRAY(0x98e2c20) col=2 row->[col]=variable syntax; (#1) row=ARRAY(0x98e2c20) col=2 row->[col]=variable syntax; row=ARRAY(0x98e0de8) col=0 row->[col]=-platform; row=ARRAY(0x98e0de8) col=1 row->[col]=linux; row=ARRAY(0x98e0de8) col=2 row->[col]=$PLATFORM;

It appears that having syntax in a line sent written with  warn gets duplicated and has ' (#1)' tacked on. I don't see this with  print STDERR nor if I replace 'syntax' with another word.

Have I stumbled on some strange error detection logic I've never seen before? FWIW I'm using v5.10.0 on Ubuntu 9.04. I'm a good little monk, so I have  use strict; and  use warnings; at the top.

-doug

Replies are listed 'Best First'.
Re: warn altering a line containting the word 'syntax'
by GrandFather (Saint) on Sep 28, 2009 at 02:21 UTC

    Show us a sample that reproduces the issue, not just the single line you think may be where the issue is. We can make guesses at what's going on, but that doesn't get anyone to the finish line in a timely fashion.


    True laziness is hard work
Re: warn altering a line containting the word 'syntax'
by ikegami (Patriarch) on Sep 28, 2009 at 02:59 UTC
    Surely something is overriding warn or something is modifying your output.
Re: warn altering a line containting the word 'syntax'
by cdarke (Prior) on Sep 28, 2009 at 08:41 UTC
    Just for fun I tried this on Ubuntu 8.04/perl 5.8.8, Ubuntu 8.10/perl 5.10.0, and Windows XP/ActiveState perl 5.10.1 and was unable to reproduce the problem. OK, none of those configurations are exactly what you have, but it is more likely that a module is overriding something.
      use diagnostics; warn "row=$row col=$col row->[col]=", $row->[$col], ";\n"; __END__ Use of uninitialized value $row in concatenation (.) or string at - li +ne 1 (#1) (W uninitialized) An undefined value was used as if it were alread +y defined. It was interpreted as a "" or a 0, but maybe it was a mi +stake. To suppress this warning assign a defined value to your variables. To help you figure out what was undefined, perl will try to tell y +ou the name of the variable (if any) that was undefined. In some cases it + cannot do this, so it also tells you what operation you used the undefine +d value in. Note, however, that perl optimizes your program and the opera +tion displayed in the warning may not necessarily appear literally in y +our program. For example, "that $foo" is usually optimized into "that + " . $foo, and the warning will refer to the concatenation (.) operat +or, even though there is no . in your program. Use of uninitialized value $col in concatenation (.) or string at - li +ne 1 (#1) Use of uninitialized value $col in array element at - line 1 (#1) Use of uninitialized value in warn at - line 1 (#1) row= col= row->[col]=;
      diagnostics
      $SIG{__WARN__} = \&warn_trap; $SIG{__DIE__} = \&death_trap; ... sub warn_trap { my $warning = $_[0]; if (caller eq $WHOAMI or !splainthis($warning)) { ... sub splainthis ... print THITHER "$orig (#$old_diag{$_})\n";