in reply to reset particular variable

I was amazed that there is indeed such a thing as "reset". That clears all package scope variables matching a pattern! Whoa!

So the first thing here is that you shouldn't be using package variables in modern Perl.

Nevertheless, usually setting $var=0, or $var=undef is enough! Those are "false" values. In Perl "undef" is actually a value. To set $var to absolutely nothing: $var=(); Many folks will write Perl for years without understand that trick.

Curiosity gets the better of me...why would you even think of using reset? Can you post some code where you think that it is required to use "reset"?

Replies are listed 'Best First'.
Re^2: reset particular variable
by AnomalousMonk (Archbishop) on Aug 19, 2009 at 14:35 UTC
    In Perl "undef" is actually a value. To set $var to absolutely nothing: $var=();
    I don't understand. Can you show an example in which the results of the  $var = (); and  $var = undef; and  undef $var; statements would differ?

    Would there ever be an advantage (other than obfuscation) to writing  $var = (); instead of  undef $var;?

      This () stuff does have VERY practical uses!

      If you have a subroutine and you want to return "nothing", meaning not "undef", not "zero", I mean absolutely "nothing", what do you do?

      This little gem, is on page 136 of "Effective Perl". It passes without even a comment!! Whoa!

      Lets say that we have:
      @output = map{zoomy_function}@input;

      Map{} is a critter that processes each @input and spews out an @output (map{} is a transformation operator).

      But, what would happen if for example the zoomy_function within map{} decides that it wants to "throw a value away". How do you do that? In Perl you can't even just exit a sub. The value of the last statement in a Perl sub is gonna get returned. What is that return value gonna be? "undef","0","-1"?

      In Perl, you can return (), which means that NOTHING is returned! Something can just come into the func and no result ever comes out. The "black hole" of map().

        If you have a subroutine and you want to return "nothing" ...
        But my questions in Re^2: reset particular variable were in the context of a discussion of differences between the  $var = (); and  $var = undef; et al statements, differences I still don't see.

        WRT the examples you give in Re^3: reset particular variable, I realize now that what you mean by 'nothing' is 'an empty list'. I see the difference between returning an empty list and returning a list consisting of a single item that is undef (an undefined something).

        Also WRT Re^3: reset particular variable, you say In Perl you can't even just exit a sub. But if you do an explicit  return; from a subroutine as opposed to an implicit return (i.e., falling off the end of the subroutine), then isn't the value returned always perfectly 'defined' semantically, dependent on the calling context of the subroutine? See examples below.

        Other than documentary emphasis, is there any reason to prefer any of the other alternatves given below over a simple  return; statement? (Actually, I seem to recall that there exists an obscure case in which  return; and  return (); differ materially, but I don't have time right now to follow it up.)

        >perl -wMstrict -le "sub Sr { return } sub Se { return () } sub Sw { return wantarray ? () : undef } print q{'}, Sr, q{' '}, join(q{' '}, 0+Sr, ''.Sr), q{'}; print q{'}, Se, q{' '}, join(q{' '}, 0+Se, ''.Se), q{'}; print q{'}, Sw, q{' '}, join(q{' '}, 0+Sw, ''.Sw), q{'}; " Use of uninitialized value in addition (+) at -e line 1. Use of uninitialized value in concatenation (.) or string ... '' '0' '' Use of uninitialized value in addition (+) at -e line 1. Use of uninitialized value in concatenation (.) or string ... '' '0' '' Use of uninitialized value in addition (+) at -e line 1. Use of uninitialized value in concatenation (.) or string ... '' '0' ''