Array and List Functions

delete $ASSOC{KEY}
Deletes the specified value from the specified associative array. Returns the deleted value, or the undefined value if nothing was deleted. Deleting from $ENV{} modifies the environment. Deleting from an array bound to a dbm file deletes the entry from the dbm file.

The following deletes all the values of an associative array:

	foreach $key (keys %ARRAY) {
		delete $ARRAY{$key};
	}
(But it would be faster to use the reset command. Saying undef %ARRAY is faster yet.)

each(ASSOC_ARRAY)
each ASSOC_ARRAY
Returns a 2 element array consisting of the key and value for the next value of an associative array, so that you can iterate over it. Entries are returned in an apparently random order. When the array is entirely read, a null array is returned (which when assigned produces a FALSE (0) value). The next call to each() after that will start iterating again. The iterator can be reset only by reading all the elements from the array. You must not modify the array while iterating over it. There is a single iterator for each associative array, shared by all each(), keys() and values() function calls in the program. The following prints out your environment like the printenv program, only in a different order:
	while (($key,$value) = each %ENV) {
		print "$key=$value\n";
	}
See also keys() and values().

grep(EXPR,LIST)
Evaluates EXPR for each element of LIST (locally setting $_ to each element) and returns the array value consisting of those elements for which the expression evaluated to true. In a scalar context, returns the number of times the expression was true.
	@foo = grep(!/^#/, @bar);    # weed out comments
Note that, since $_ is a reference into the array value, it can be used to modify the elements of the array. While this is useful and supported, it can cause bizarre results if the LIST is not a named array.

join(EXPR,LIST)
join(EXPR,ARRAY)
Joins the separate strings of LIST or ARRAY into a single string with fields separated by the value of EXPR, and returns the string. Example:
    
    $_ = join(':',
		$login,$passwd,$uid,$gid,$gcos,$home,$shell);
See split.

keys(ASSOC_ARRAY)
keys ASSOC_ARRAY
Returns a normal array consisting of all the keys of the named associative array. The keys are returned in an apparently random order, but it is the same order as either the values() or each() function produces (given that the associative array has not been modified). Here is yet another way to print your environment:
	@keys = keys %ENV;
	@values = values %ENV;
	while ($#keys >= 0) {
		print pop(@keys), '=', pop(@values), "\n";
	}

or how about sorted by key:

	foreach $key (sort(keys %ENV)) {
		print $key, '=', $ENV{$key}, "\n";
	}

pop(ARRAY)
pop ARRAY
Pops and returns the last value of the array, shortening the array by 1. Has the same effect as
	$tmp = $ARRAY[$#ARRAY--];
If there are no elements in the array, returns the undefined value.

push(ARRAY,LIST)
Treats ARRAY (@ is optional) as a stack, and pushes the values of LIST onto the end of ARRAY. The length of ARRAY increases by the length of LIST. Has the same effect as
    for $value (LIST) {
	    $ARRAY[++$#ARRAY] = $value;
    }
but is more efficient.

reverse(LIST)
reverse LIST
In an array context, returns an array value consisting of the elements of LIST in the opposite order. In a scalar context, returns a string value consisting of the bytes of the first element of LIST in the opposite order.

shift(ARRAY)
shift ARRAY
shift
Shifts the first value of the array off and returns it, shortening the array by 1 and moving everything down. If there are no elements in the array, returns the undefined value. If ARRAY is omitted, shifts the @ARGV array in the main program, and the @_ array in subroutines. (This is determined lexically.) See also unshift(), push() and pop(). Shift() and unshift() do the same thing to the left end of an array that push() and pop() do to the right end.

sort(SUBROUTINE LIST)
sort(LIST)
sort SUBROUTINE LIST
sort BLOCK LIST
sort LIST
Sorts the LIST and returns the sorted array value. Nonexistent values of arrays are stripped out. If SUBROUTINE or BLOCK is omitted, sorts in standard string comparison order. If SUBROUTINE is specified, gives the name of a subroutine that returns an integer less than, equal to, or greater than 0, depending on how the elements of the array are to be ordered. (The <=> and cmp operators are extremely useful in such routines.) SUBROUTINE may be a scalar variable name, in which case the value provides the name of the subroutine to use. In place of a SUBROUTINE name, you can provide a BLOCK as an anonymous, in-line sort subroutine.

In the interests of efficiency the normal calling code for subroutines is bypassed, with the following effects: the subroutine may not be a recursive subroutine, and the two elements to be compared are passed into the subroutine not via @_ but as $a and $b (see example below). They are passed by reference so don't modify $a and $b.

Examples:

	# sort lexically
	@articles = sort @files;

	# same thing, but with explicit sort routine
	@articles = sort {$a cmp $b} @files;

	# same thing in reversed order
	@articles = sort {$b cmp $a} @files;

	# sort numerically ascending
	@articles = sort {$a <=> $b} @files;

	# sort numerically descending
	@articles = sort {$b <=> $a} @files;

	# sort using explicit subroutine name
	sub byage {
	    $age{$a} <=> $age{$b};	# presuming integers
	}
	@sortedclass = sort byage @class;

	sub reverse { $b cmp $a; }
	@harry = ('dog','cat','x','Cain','Abel');
	@george = ('gone','chased','yz','Punished','Axed');
	print sort @harry;
		# prints AbelCaincatdogx
	print sort reverse @harry;
		# prints xdogcatCainAbel
	print sort @george, 'to', @harry;
		# prints AbelAxedCainPunishedcatchaseddoggonetoxyz

splice(ARRAY,OFFSET,LENGTH,LIST)
splice(ARRAY,OFFSET,LENGTH)
splice(ARRAY,OFFSET)
Removes the elements designated by OFFSET and LENGTH from an array, and replaces them with the elements of LIST, if any. Returns the elements removed from the array. The array grows or shrinks as necessary. If LENGTH is omitted, removes everything from OFFSET onward. The following equivalencies hold (assuming $[ == 0):
	push(@a,$x,$y)\h'|3.5i'splice(@a,$#a+1,0,$x,$y)
	pop(@a)\h'|3.5i'splice(@a,-1)
	shift(@a)\h'|3.5i'splice(@a,0,1)
	unshift(@a,$x,$y)\h'|3.5i'splice(@a,0,0,$x,$y)
	$a[$x] = $y\h'|3.5i'splice(@a,$x,1,$y);

Example, assuming array lengths are passed before arrays:
	
	sub aeq {	# compare two array values
		local(@a) = splice(@_,0,shift);
		local(@b) = splice(@_,0,shift);
		return 0 unless @a == @b;	# same len?
		while (@a) {
		    return 0 if pop(@a) ne pop(@b);
		}
		return 1;
	}
	if (&aeq($len,@foo[1..$len],0+@bar,@bar)) { ... }

split(/PATTERN/,EXPR,LIMIT)
split(/PATTERN/,EXPR)
split(/PATTERN/)
split
Splits a string into an array of strings, and returns it. (If not in an array context, returns the number of fields found and splits into the @_ array. (In an array context, you can force the split into @_ by using ?? as the pattern delimiters, but it still returns the array value.)) If EXPR is omitted, splits the $_ string. If PATTERN is also omitted, splits on whitespace (/[\ \t\n]+/). Anything matching PATTERN is taken to be a delimiter separating the fields. (Note that the delimiter may be longer than one character.) If LIMIT is specified, splits into no more than that many fields (though it may split into fewer). If LIMIT is unspecified, trailing null fields are stripped (which potential users of pop() would do well to remember). A pattern matching the null string (not to be confused with a null pattern //, which is just one member of the set of patterns matching a null string) will split the value of EXPR into separate characters at each point it matches that way. For example:
	print join(':', split(/ */, 'hi there'));
produces the output 'h:i:t:h:e:r:e'.

The LIMIT parameter can be used to partially split a line

	($login, $passwd, $remainder) = split(/:/, $_, 3);
(When assigning to a list, if LIMIT is omitted, perl supplies a LIMIT one larger than the number of variables in the list, to avoid unnecessary work. For the list above LIMIT would have been 4 by default. In time critical applications it behooves you not to split into more fields than you really need.)

If the PATTERN contains parentheses, additional array elements are created from each matching substring in the delimiter.

split(/([,-])/,"1-10,20");

produces the array value

(1,'-',10,',',20)

The pattern /PATTERN/ may be replaced with an expression to specify patterns that vary at runtime. (To do runtime compilation only once, use /$variable/o.) As a special case, specifying a space ('\ ') will split on white space just as split with no arguments does, but leading white space does NOT produce a null first field. Thus, split('\ ') can be used to emulate awk's default behavior, whereas split(/\ /) will give you as many null initial fields as there are leading spaces.

Example:

	open(passwd, '/etc/passwd');
	while (<passwd>) {
		($login, $passwd, $uid, $gid, $gcos, $home, $shell)
			= split(/:/);
		...
	}
(Note that $shell above will still have a newline on it. See chop().) See also join.

unshift(ARRAY,LIST)
Does the opposite of a shift. Or the opposite of a push, depending on how you look at it. Prepends list to the front of the array, and returns the number of elements in the new array.
	unshift(ARGV, '-e') unless $ARGV[0] =~ /^-/;

values(ASSOC_ARRAY)
values ASSOC_ARRAY
Returns a normal array consisting of all the values of the named associative array. The values are returned in an apparently random order, but it is the same order as either the keys() or each() function would produce on the same array. See also keys() and each().