It is quite interesting what the module does internally. Let's add Data::Dumper to see it:
use Data::Dumper; (...) # Before our callback. print $cookie_jar->as_string, "\n"; print Dumper(\%{$cookie_jar}); $cookie_jar->scan( $self_enclosed_callback ); # After our callback. print $cookie_jar->as_string, "\n"; print Dumper(\%{$cookie_jar});
When you change the domain it just copies the contents to a new hash key, empties the old one but never deletes it! Anyway, something more related to the problem. The module doesn't provide a lot of methods for modifying the cookies, so any other solution would require to mess directly with the hash. It would be straightforward to test all cookies and change a value, although not so much to change, say, a domain name.
use WWW::Mechanize; use HTTP::Cookies; use Data::Dumper; my $mech = WWW::Mechanize->new(); my $cookie_jar = HTTP::Cookies->new( autosave => 1, file => "/your/cookies.txt" ); # $cookie_jar->clear(); $mech->cookie_jar($cookie_jar); $mech->agent_alias('Windows IE 6'); $mech->get("http://www.amazon.com"); my $self_enclosed_callback = sub { my ( $version, $key, $val, $path, $domain, $port, $path_spec, $secure, $expires, $discard, $extra ) = @_; # Remove the currently iterating cookie from the jar. # NB: this might be dangerous! Seems to work though. $cookie_jar->clear( $domain, $path, $key ); # Now change domain, just for example. $domain =~ s/\.com\z/.org/; $cookie_jar->set_cookie( $version, $key, $val, $path, $domain, $port, $path_spec, $secure, $expires, $discard, $extra ); }; # Original state. print $cookie_jar->as_string, "\n"; #First solution. foreach my $site (map( values(%{$_}), map( values(%{$_}),values %{$cookie_jar->{'COO +KIES'}}) )) { $site->[1] =~ s/no/yes/; $site->[1] =~ s/\d+/time/; $site->[1] =~ s/\d+/blarf/g; } print $cookie_jar->as_string, "\n"; #Second solution. my $cookies = $cookie_jar->{'COOKIES'}; foreach my $site (keys %{$cookies}) { foreach my $path (keys %{$cookies->{$site}}) { foreach my $value (keys %{$cookies->{$site}{$path}}) { $cookies->{$site}{$path}{$value}[1] =~ s/time-blarf-blarf/$sit +e/; $cookies->{$site}{$path}{$value}[1] =~ s/.*l/$path/; $cookies->{$site}{$path}{$value}[1] =~ s/yesskin/$value/g; } } } print $cookie_jar->as_string, "\n";
The first solution would behave as you expected your code that prints with as_string and then re-inserts the cookie to behave. The second one provides you with the site, path and name of the cookie, at the cost of three nested loops. I think there is a solution in the middle of those two, more fancy and without so many nested functions, or loops, but I will leave that to the next poster. :)

In reply to Re^4: Mechanize cookie jar update? by AV-2
in thread Mechanize cookie jar update? by Anonymous Monk

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.