in reply to Strange problem with nested arrays and scoping.

The first thing that I'm seeing looking at your code snippets is that you confuse array elements and array slices. You write:
push(@{@{@holder[$sheet]}[$iC]},@{@{@data[$sheet]}[$iC]}[$index]);
and I'm almost certain that you mean:
push(@{${$holder[$sheet]}[$iC]},${${$data[$sheet]}[$iC]}[$index]);
To simplify - to access an array element you use:
$array[254] = 'foo';
The @array[...] notation is used to access a slice, for example @foo = @array[2 .. 4]; which would copy the data from $array[2], $array[3] and $array[4] to $foo[0], $foo[1], $foo[2].

Fix your code to use $ instead of @ correctly, and see if that fixes your problem.

Michael