user238021
user238021

Reputation: 1221

Transforming hash keys to an array

I have a hash(%hash) with the following values

test0  something1
test1  something
test2  something

I need to build an array from the keys with the following elements

@test_array = part0_0 part1_0 part2_0

Basically, I have to take testx (key) and replace it as partx_0

Of course, I can easily create the array like the following

my @test_array;

foreach my $keys (keys %hash) {
    push(@test_array,$keys);
}

and I will get

@test_array = test0 test1 test2

but what I would like is to get part0_0 instead of test0, part1_0 instead of test1 and part2_0 instead of test2

Upvotes: 5

Views: 21904

Answers (4)

Anatoliy Khmelevskiy
Anatoliy Khmelevskiy

Reputation: 131

why not do easier

my @array = ( keys %hash )

Upvotes: 13

karthi_ms
karthi_ms

Reputation: 5698

my @array = map { s/^.+([0-9]).*/part$1_0/g;split }  keys %hash;

Upvotes: 0

TLP
TLP

Reputation: 67900

Looks like a good time to use the non-destructive /r option for substitutions.

my @array = map s/^test(\d+)/part${1}_0/r, keys %a;

For perl versions that do not support /r:

my @array = map { s/^test(\d+)/part${1}_0/; $_ } keys %a:

Upvotes: 7

ikegami
ikegami

Reputation: 385657

my @a;
for (keys %hash) {
   push @a, 'part' . ( /^test([0-9]+)/ )[0] . '_0';
}

But that just begs for map to be used.

my @a =
   map { 'part' . ( /^test([0-9]+)/ )[0] . '_0' }
    keys %hash;

Upvotes: 3

Related Questions