On Mon, Mar 1, 2010 at 11:27 PM, John W. Krahn <jwkr...@shaw.ca> wrote:

> raphael() wrote:
>
>> Hi,
>>
>
> Hello,
>
>
>  I am trying to understand WWW::Mechanize
>>
>
> Did you also look at these pages:
>
>
> http://search.cpan.org/~petdance/WWW-Mechanize-1.60/lib/WWW/Mechanize/Examples.pod<http://search.cpan.org/%7Epetdance/WWW-Mechanize-1.60/lib/WWW/Mechanize/Examples.pod>
>
> http://search.cpan.org/~petdance/WWW-Mechanize-1.60/lib/WWW/Mechanize/FAQ.pod<http://search.cpan.org/%7Epetdance/WWW-Mechanize-1.60/lib/WWW/Mechanize/FAQ.pod>
>
> http://search.cpan.org/~petdance/WWW-Mechanize-1.60/lib/WWW/Mechanize/Cookbook.pod<http://search.cpan.org/%7Epetdance/WWW-Mechanize-1.60/lib/WWW/Mechanize/Cookbook.pod>
>
>
>
>  I understand that the downloaded content is stored in content().
>> Why am I not able to use a regex on it in scalar form?
>>
>> ------code------
>>
>> use strict;
>> use warnings;
>> use WWW::Mechanize;
>>
>> my $mech = WWW::Mechanize->new();
>> $mech->get("http://checkip.dyndns.org";);
>> my $last_page = $mech->content(); # last page fetched
>>
>> # this works if I store content in an array @last_page
>> # for ( @last_page ) {
>> #    if ( m/([\d+.]+)/ ) {
>> #    print "$1\n";
>> #    }
>> # }
>>
>
> $mech->content() returns a scalar value so that is the same as saying:
>
> if ( $last_page[ 0 ] =~ m/([\d+.]+)/ ) {
>
>   print "$1\n";
> }
>
>
>  # ( my $ip ) = grep/(\d+\.)/, $last_page;
>>
>
> grep() returns the list items that match the expression /(\d+\.)/.  The
> regular expression is only used to determine which items to return, it has
> no effect on the content of those items.  If you want to effect the contents
> of the list then you have to use map() instead.
>
>
>
>  ( my $ip = $last_page ) =~ m/([\d+\.]+)/;
>> print "$ip\n";
>>
>> ------end------
>>
>> my $ip gets the whole source page as its value.
>>
>> --
>> Got it while writing out this post :)
>> --
>>
>> Now the question becomes what is the difference between these two?
>>
>> ( my $ip = $last_page ) =~ m/([\d+\.]+)/;
>>
>
> That is the same as:
>
> my $ip = $last_page;
> $ip =~ m/([\d+\.]+)/;
>
> You are not doing anything with the string stored in $1.
>
> And BTW, '+' is not a valid IP address character.
>
>
>
>  ( my $ip ) = ( $last_page ) =~ m/([\d+\.]+)/;
>>
>
> That is equivalent to:
>
> my $ip;
> if ( $last_page =~ m/([\d+\.]+)/ ) {
>    $ip = $1;
>
>    }
>
>
>  I think the above one is "wrong syntax" for using list context?
>>
>
> No, you *have* to use list context or $ip will be assigned the result of
> the match operator (true or false) and not the contents of the capturing
> parentheses.
>
>
>
>  Also  how can I make grep work?
>>
>> ( my $ip ) = grep/(\d+\.)/, $last_page;
>>
>
> You can't, grep() doesn't work that way.  What you are looking for is
> map():
>
> ( my $ip ) = map /([\d.]+)/, $last_page;
>
> Or, since you are not actually using a list, use the /g global option to
> the match operator:
>
> ( my $ip ) = $last_page =~ /[\d.]+/g;
>
> Note that this will return a list of [\d.]+ strings but only the first one
> will be stored in $ip and the rest will be discarded.
>
>
>
>
> John
> --
> The programmer is fighting against the two most
> destructive forces in the universe: entropy and
> human stupidity.               -- Damian Conway
>
> --
> To unsubscribe, e-mail: beginners-unsubscr...@perl.org
> For additional commands, e-mail: beginners-h...@perl.org
> http://learn.perl.org/
>
>
>
Cool! I have to admit that is a "detailed" answer.
Also thanks for clearing out the differences between these two..

( my $ip = $last_page ) =~ m/([\d+\.]+)/;
( my $ip ) = ( $last_page ) =~ m/([\d+\.]+)/;

Just to clear out any misunderstanding "by above one"
I meant ( my $ip = $last_page ) =~ m/([\d+\.]+)/;
Now am I getting this right that this is the *wrong syntax* to get list
context.

Your post was very helpful since I didn't know about parenthesis (or lack of
it)
to capture values.

I always did use parenthesis to capture values like
( my $ip ) = $last_page =~ m/*(*[\d+\.]+*)*/g;

Now I *know* this works
( my $ip ) = $last_page =~ m/[\d+\.]+/g;

Thanks again John.

Reply via email to