Perl undef Function

Perl undef function returns an undefined value, freeing up the memory used by the variable arguments passed to it. You can use this function with scalars, lists or arrays, hashes, functions or typeglobs. In this short free tutorial I’ll show you some opportunities about using this built-in function in your Perl scripts.

For this function two syntax forms are available, as shown below:

undef EXPR

When you declare for first time a variable in Perl without assigning any value to it, Perl will assign by default the undef value to it. If you forget to assign any value to a variable declared in a Perl script, there are chances that your script will not crash if you will run it.

But if you’ll use warnings, Perl will always warn you if you have unassigned variables in your script. It’s a good habit to use warnings because all your typos will have the undef value assigned and Perl will warn you about them.

You can omit the expression when you use undef and in this case undef is a lvalue, the undefined value being a special data type, a special case of a scalar value. If you’ll use it without EXPR, the Perl undef function will return the undefined value.

For numeric scalar variables the undef value is 0, meanwhile for string variables it indicates an empty string. To distinguish between 0 / empty strings and the undef value, Perl provides the defined function that allows you to check up if a variable has the undef value or not.

Next, I’ll show you some ways to use this function.

How to use Perl undef function with scalars

See the following snippet code:

# declare a scalar variable without initializing it
my $var1;
# declare a scalar variable and assign a value to it
my $var2 = "Perl undef function";
print "var1 undefined\n" unless defined $var1;
print "var2 defined\n" if defined $var2;

# free resource for $var2 and make it undefined
undef $var2;
print "var2 undefined\n" unless defined $var2;

and the output for this code:

var1 undefined
var2 defined
var2 undefined

How to use Perl undef function with arrays

If you want to free up the memory resources occupied by a big array, you can use the undef function like in the following lines of code:

my @array = ;
# perform some actions with the array’s elements
# …

# free the memory where the array was stored
undef (@array);
print "\@array is undefined\n" unless defined(@array);

In the above code, we read from standard input some lines of data and we store them in the @array. After performing some tasks against the elements of the array, we free up the memory usage by that array variable. If you execute this code, finally the message: "@array is undefined" will be printed. However, please note that if you have a multidimensional array, which has some references to other structures, it is not enough to free the initial array only. To illustrate, please see the next code:

# declare and initialize some arrays
my @array1 = qw(1 2 3 4);
my @array2 = qw(5 6 7 8);
# define a reference for the second array
my $ref2 = \@array2;
# append the reference o the first array
push @array1, $ref2;

# free the memory usage by @array1;
undef (@array1);
print "\@array2 still available: @array2\n";
# it displays: @array2 still available: 5 6 7 8

If you want to free the usage memory for an array and for all its references too, you must consider to step down in a recursive way through all the array references and free the usage memory until no more references are found. To see if an element of an array is a reference to some other data type structure, you can use the ref function, something like in the next lines of code:

use warnings;

my @array1 = qw(1 2);
my @array2 = qw(3 4);
$array1[2] = \@array2;

for(my $i=0; $i < scalar (@array1); $i++)
  if(ref $array1[$i] eq "") {
    print "$i: NO REFERENCE\n";
  } elsif (ref $array1[$i] eq "ARRAY") {
    print "$i: ARRAY\n";

and the output:


You can use undef against certain elements of an array:

use warnings;

my @array = qw(1 2 3);
undef $array[1];
print "array size = ",scalar @array, "\n";
# displays: array size = 3

The second element of the array will have the undef value, but the dimension of the array doesn’t change.

How to use Perl undef function with hashes

The below code will show you how to use Perl undef upon an entire hash (free up the memory usage by it) or to undef certain elements of the hash. If you want to delete an entry from a hash, you must use the delete function instead. Using Perl undef with a $key element of a hash (using either undef $hash{$key} or $hash{$key} = undef) will only have as effect to undefine the respective value associated with the $key. The following code speaks by itself:

#define a hash and assign some elements to it
my %hash = (1 => "one",   2 => "two", 
         3 => "three", 4 => "four");

# undef the value of the elemnt with the key 2
undef $hash{2};

# undef the value of the elemnt with the key 3
$hash{3} = undef;

# delete the element with the value 4
delete $hash{4};

#undef the entire hash
undef %hash;

How to use Perl undef function with subroutines

There are cases when you want to write a subroutine that returns an undef value if some errors happen. The next example will show you how to return undef if you divide some numbers by 0.

sub divSub {
  local ($n, $k) = @_;
    return ($k == 0 ? undef : $n / $k);

($n, $k) = (25, 0);
# divide $n by $k
print  "Can\'t divide by 0\n" unless defined divSub($n, $k);
# it displays: Can't divide by 0

Please click here to download the Perl undef script with all the above examples included.

Table of Contents:

A Perl Script
Install Perl
Running Perl
Perl Data Types
Perl Variables
Perl Operators
Perl Lists
Perl Arrays
    Array Size
    Array Length
Perl Hashes
Perl Statements
    Perl if
    Perl unless
    Perl switch
    Perl while
    Perl do-while
    Perl until
    Perl do-until
    Perl for
    Perl foreach
Built-in Perl Functions
    Functions by Category
        String Functions
        Regular Expressions and Pattern Matching
        List Functions
        Array Functions
        Hash Functions
        Miscellaneous Functions
    Functions in alphabetical order
        undef (more)

return from Perl undef Function to Perl Basics

Would you like to create your own website like this one?
Hit the Alarm Clock!

Site Build It!