Oskar Gibson
Oskar Gibson

Reputation: 133

perl - how do you extract all elements of an array except the last?

I need to extract all elements in an array except the last and store them in a scalar for later use. At first, I thought this would be possible using array slices, but it appears that you cannot count backwards. For example:

my $foo = ($bar[0..-2]);  

or

my $foo = ($bar[-2..0]);  

Any help would be greatly appreciated as this is starting to drive me insane, and I have been unable to find a solution elsewhere or by experimenting.
Oskar

Upvotes: 13

Views: 12016

Answers (4)

ysth
ysth

Reputation: 98498

my @foo = @bar;
pop @foo;

or

my @foo = @bar[ -@bar .. -2 ];

or if it's ok to change @bar, just

my @foo = splice( @bar, 0, -1 );

Upvotes: 12

toolic
toolic

Reputation: 62236

This will store all array elements, except for the last, into a scalar. Each array element will be separated by a single space.

use strict;
use warnings;

my @nums = 1 .. 6;
my $str = "@nums[0 .. $#nums - 1]";
print $str;

__END__

1 2 3 4 5

Don't you really want to store the elements into another array? If you store them in a scalar, it can be problematic to retrieve them. In my example above, if any element of the array already had a single space, you would not be able to properly reconstruct the array from the scalar.

Upvotes: 2

rubber boots
rubber boots

Reputation: 15204

my $foo = join ',', @bar[0..$#bar-1];

will concatenate (by comma) all elements of the array @bar except the last one into foo.

Regards

rbo

Upvotes: 19

Sinan Ünür
Sinan Ünür

Reputation: 118166

@foo = @bar[0 .. $#foo - 1];

If you want to create a head-scratcher:

my @x = (1, 2, 3);
print "@x[-@x .. -2]";

Upvotes: 2

Related Questions