Из требуемого вывода видно, что вам нужен хеш-адрес, который находится в массиве sequence
. Затем вам нужно добавить $needed
количество его копий в этот массив, с увеличением contentNumber
в каждом. (Я не могу согласовать это с показанным кодом, и я go получу желаемый результат, который кажется ясным.)
Не забывайте, что копии должны быть глубокие копии; † здесь я использую dclone
из Для хранения .
use Storable qw(dclone);
...
my $seq_href = dclone( $data->{sequence}[0] );
for (1..$needed) {
++$seq_href->{attribute}{contentNumber};
push @{$data->{sequence}}, dclone( $seq_href );
}
my $new_json_string = $json->encode($data); # then write it to file
В моих тестах получается желаемый результат JSON.
† Переменную или структуру данных, содержащую ссылки, нельзя скопировать в новую независимую, просто назначив
my @copy = @ary; # oups ... any references in there?
Проблема заключается в том, что когда элементы ссылки в @ary
копируются в @copy
, тогда эти элементы в @copy
, являющиеся теми же ссылками, указывают на те же области памяти, что и в @ary
! Так что @copy
и @ary
отнюдь не независимы - они обмениваются данными.
Иногда это может быть желательным, но если нам нужна независимая копия (как в этой задаче), тогда нам нужно полностью следовать этим ссылкам и на самом деле копировать данные , чтобы скопировать структуру действительно имеет свои данные. И, конечно, есть модули, которые делают это.
Сложные (вложенные) структуры данных по определению имеют ссылки на элементы, поэтому мы, конечно, не можем получить независимые копии одним назначением верхнего уровня.
Это очень тощее описание потенциально хитрой и тонкой ошибки. Я бы посоветовал прочитать больше об этом. Один ресурс, который появляется, это Effective Perler article .