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

Hello PerlMonks!

I have some broken code here, that is perplexing me. I am using LWP::UserAgent to pull information off of a website.

I have had no problem with this until I wrote the following bit of (broken) code:

#!/usr/bin/perl -w use strict; use HTTP::Request::Common qw(POST); use LWP::UserAgent; my ($ua, $req, $chrom, $start, $end, $db, $check); $chrom="7"; $start="117287204"; $end="117475903"; $db="hg11"; open (GENOMIC, ">genomic_dna") || die "Error: Can't open genomic_dna: +$!"; $ua = LWP::UserAgent->new; $req = POST 'http://genome.ucsc.edu/cgi-bin/hgText', [ hgsid => '6765675', g => 'htcGetDna2', c => 'chr'.$chrom, l => $start, r => $end, db => $db, hgc.dna.out1 => 'lc', boolshad.hgc.dna.rc => '1', Submit => 'Submit' ]; print GENOMIC $ua->request($req)->content; close (GENOMIC) || die "Error: Can't close genomic_dna: $!";
The problem is that if I paste the relevant command into a browser - everything is fine, but I've broken it down for an LWP request.

Attempting to run this leads to the following:

[dswan@ashtaroth useful]$ ./genomic.pl Bareword "hgc" not allowed while "strict subs" in use at ./genomic.pl +line 18. Bareword "dna" not allowed while "strict subs" in use at ./genomic.pl +line 18. Bareword "boolshad" not allowed while "strict subs" in use at ./genomi +c.pl line 18. Bareword "hgc" not allowed while "strict subs" in use at ./genomic.pl +line 18. Bareword "dna" not allowed while "strict subs" in use at ./genomic.pl +line 18. Execution of ./genomic.pl aborted due to compilation errors.

Even to me this obviously means LWP doesn't much like the '.' in the LWP request. I've tried to escape them, quote them (double and single), but to be honest I don't see why it should be a big issue (except the program returns the wrong data obviously :P)

Any ideas?

As always the help is greatly appreciated

Bukowski - aka Dan (dcs@black.hole-in-the.net)
"Coffee for the mind, Pizza for the body, Sushi for the soul" -Userfriendly

Replies are listed 'Best First'.
Re: LWP and barewords under strict
by suaveant (Parson) on Jul 09, 2002 at 13:59 UTC
    And it shouldn't... . is string concatenation in perl, so perl is trying to concatenate barewords... with => perl allows you to not quote the string on the left, but only very simple strings without . or spaces and the like... put your left hand side strings in quotes and all will be well...

                    - Ant
                    - Some of my best work - (1 2 3)

      Yes this worked a treat (and I had tried it before!). Of course it worked properly *after* I realised there was a horrendus typo in the LWP request.......

      D'OH!

      Bukowski - aka Dan (dcs@black.hole-in-the.net)
      "Coffee for the mind, Pizza for the body, Sushi for the soul" -Userfriendly

Re: LWP and barewords under strict
by Abigail-II (Bishop) on Jul 09, 2002 at 14:03 UTC
    You are getting syntax errors. That has nothing to do with LWP, but all the do with your code. You have hgc.dna.out1, three bare words that you are trying to concatenate. With use strict, that's a syntax error.

    You have to use quotes.

    Abigail

Re: LWP and barewords under strict
by hacker (Priest) on Jul 10, 2002 at 11:10 UTC
    A few comments:

    You never use $check. One thing I've taken on as a habit is to declare the variables I use as 'my' when I use them. When you pre-declare them in one string as you have with my ($ua, $req, $chrom, $start, $end, $db, $check);, you increase the chance of error when you remove/add them later, as you have in this script. One possible solution is as follows:

    my $ua = LWP::UserAgent->new; my $chrom = "7"; my $start = "117287204"; my $end = "117475903"; my $db = "hg11"; my $url = "http://genome.ucsc.edu/cgi-bin/hgText";
    (I also like to indent for readability, but that's more a matter of personal style.)

    You also are not properly separating your POST object. It should look something like:

    # Indented again my $request = POST $url, ['hgsid' => "6765675", 'g' => "htcGetDna2", 'c' => 'chr'.$chrom, 'l' => $start, 'r' => $end, 'db' => $db, 'hgc.dna.out1' => 'lc', 'boolshad.hgc.dna.rc' => '1', 'Submit' => 'Submit' ];
    Note the use of the single quotes around the key, which was missing in your original script. Adding the above fixes allows your code to work as intended.