Beefy Boxes and Bandwidth Generously Provided by pair Networks Joe
laziness, impatience, and hubris
 
PerlMonks  

Re^2: sub that sets $_

by Animator (Hermit)
on Jun 28, 2005 at 12:08 UTC ( #470592=note: print w/ replies, xml ) Need Help??


in reply to Re: sub that sets $_
in thread sub that sets $_

That's not quite correct...

IO::Prompt returns an object, in that object bool is overloaded, and bool sets $_. (which is run for each iteration of the while to decided if it's a true or false value)

Which means that while ($z = prompt "") { will set $_ and $z. This is a bad idea. What if the code is used in an inner loop? when the outer loop uses $_ for example?

If one wants to get the same behaviour then it would be enough to do a simple assignment in the subroutine to $_ and return the value of $_.

Example code that is similar to the code in IO::Prompt

package Example; use overload q{bool} => sub { $_="def"; }; sub new { bless {}; } sub test { return $_[0]; } package main; my $z=new Example; $_="ghi"; while ($m = $z->test()) { print; print $m; last; };

Update: added relevant part of IO::Prompt


Comment on Re^2: sub that sets $_
Select or Download Code
Re^3: sub that sets $_
by TheDamian (Priest) on Jun 29, 2005 at 00:04 UTC
    Which means that while ($z = prompt "") { will set $_ and $z. This is a bad idea. What if the code is used in an inner loop? when the outer loop uses $_ for example?
    Yes, that is a nuisance. I'm working on overcoming that problem, but it's difficult: Perl never quite gives you enough context information to detect the assignment. :-(
      On further investigation, it appears that you can tell the two contexts apart using the Want module. Specifically, want('BOOL') knows the difference. For example:
      my $flipflop = 0; sub foo { use Want qw(want); print 'not ' if !want 'BOOL'; print "bool\n"; return $flipflop=!$flipflop; # alternate true and false } for (1..3) { while (foo() ) { # print "here 1\n"; } while ($answer = foo() ) { # print "here 2\n"; } }

      Unfortunately, under 5.8.3 I get bus errors if there I uncomment the print statements, or if there is anything in the while blocks. :-(

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://470592]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (8)
As of 2014-04-17 05:32 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    April first is:







    Results (439 votes), past polls