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

I have come across a line of code. I can't seem to understand what it does. I know that it searches for the "&" character in $ENV("QUERY_STRING"). But I can't seem to understand the line of code a bit later asking if $_==4. Can some help explain this, and what this line is looking for?
$_=split /&/,$ENV{"QUERY_STRING"}; ... ... ... if ($_==4){print "<p>";$pong=`./.blah.pl`;print $pong;}

Replies are listed 'Best First'.
Re: Split Line
by sauoq (Abbot) on Sep 30, 2002 at 17:45 UTC

    When split is not used in list context, it splits into @_ and returns the number of elements.

    -sauoq
    "My two cents aren't worth a dime.";
    
Re: Split Line
by dreadpiratepeter (Priest) on Sep 30, 2002 at 17:45 UTC
    Oof, this is ugly code. What it is doing is performing a split on an ampersand, but, it is calling split in scalar context, which returns the number of items resulting, not the items themselves. Then, it puts that into $_ to confuse matters.
    Therefore, when it checks $_ later on, it is checking if there were 3 &'s (because that would split into 4 elements).

    I personally would have used a meaningful variable name there (like $num_clauses or such) to clarify.

    Hope this helps,
    Update: As pointed out, split in scalar context has the side effect of populating @_, you should look out for use of this further on in the code. Once again, you can make this explicit and meaningful using something like:
    my @elements=split(...); my $num_elements = @elements;
    or just do a scalar test on @elements later on:
    if (@elements == 4) {


    -pete
    "Worry is like a rocking chair. It gives you something to do, but it doesn't get you anywhere."
Re: Split Line
by Zaxo (Archbishop) on Sep 30, 2002 at 17:51 UTC

    The split is done in scalar context ($_ is scalar and sets the context) so the assignment is counting the number of pieces you get, one more than the number of &'s. The following line executes blah.pl using backticks to collect the text output of the script and print it after a paragraph tag.

    You should toss this and start over. You are handrolling a cgi query parser when you should use CGI;. It will do a much better job.

    After Compline,
    Zaxo

Re: Split Line
by rir (Vicar) on Sep 30, 2002 at 17:51 UTC
    split returns the count of substrings that it found.