Это - полностью не изящное решение, и при этом это не лучшее решение никаким фрагментом воображения. Но это интересно!
package zip;
sub TIEARRAY {
my ($class, @self) = @_;
bless \@self, $class;
}
sub FETCH {
my ($self, $index) = @_;
$self->[$index % @$self][$index / @$self];
}
sub STORE {
my ($self, $index, $value) = @_;
$self->[$index % @$self][$index / @$self] = $value;
}
sub FETCHSIZE {
my ($self) = @_;
my $size = 0;
@$_ > $size and $size = @$_ for @$self;
$size * @$self;
}
sub CLEAR {
my ($self) = @_;
@$_ = () for @$self;
}
package main;
my @a = qw(a b c d e f g);
my @b = 1 .. 7;
tie my @c, zip => \@a, \@b;
print "@c\n"; # ==> a 1 b 2 c 3 d 4 e 5 f 6 g 7
Как обработать STORESIZE
/PUSH
/POP
/SHIFT
/UNSHIFT
/SPLICE
осуществление, оставленное читателю.
Для этого можно использовать Json.NET .
JArray a = JArray.Parse(jsonStr);
JArray будет содержать либо строки, либо вложенные JArray в зависимости от JSON.