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

Hi fellow Monks!

I am encountering this error "Use of uninitialized value $word in print at C:\test\test.pl" every time I put anchors ^ or $ beside the variable $key. My goal here is to grab the exact searchword in the list and return its corresponding website. I am having trouble when in case that my searchword is "ICS" (which has an empty website in the list) but instead returning "TRONICS" which has a value.

Here is my code:

my $key = "searchword"; my $path = "C:\\test\\list.txt"; open(INFILE, "<$path"); while (<INFILE>) { if ( /^$key\t(www\.[^.]*\.com)/i ) { my $word = $1; } } print $word; close(INFILE);

Thank you in advance for adding your inputs in to this one!

Replies are listed 'Best First'.
Re: Use of uninitialized value in regexp
by Athanasius (Archbishop) on Feb 09, 2015 at 06:42 UTC

    Hello bbb,

    The variable $word is lexically scoped, meaning its scope extends only to the end of the block in which it is declared. Since you declare it in an if block which is itself within a while block, it is out of scope by the time you try to print it.

    You need to declare $word before the while loop.1 If you had use strict; at the head of your script, it would highlight this kind of error for you.

    1Update: Or move the print statement to within the if block.

    Hope that helps,

    Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

      Hi Athanasius,

      The code now works after I move the print inside if.

      My bad for missing this one. I've got one more question if you don't mind. When I put $ anchor after $word variable, I am having the same problem "Uninitialized $\ (since \t comes after $word -> $word$\t)". Could you give me a hint on how to deal with anchors that will be beside "\"?

      Thank you very much!

        In the expression  /foo$\t/ the RE compiler takes  $\ to be the  $OUTPUT_RECORD_SEPARATOR special scalar variable (see perlvar) and interpolates its value in the regex. One way to disambiguate  $ here would be to use the  /x regex modifier (see Modifiers in perlre) to introduce whitespace around the assertion:  /foo $ \t/x. However, this is meaningless because you're asking to match a pattern that has a  \t (tab) character beyond the end of the string! There is no such string. What is your real intent with this usage of the  $ assertion?

        Update: The  /m modifier (again, Modifiers) allows the  ^ $ anchor assertions to match against embedded  \n (newline) characters in a string, but again, the expression  / $ \t /xm is unmatchable because a  $ before an embedded newline would be followed by a  \n and not a  \t character.


        Give a man a fish:  <%-(-(-(-<