Я написал функцию, которая принимает Array of Arrays и печатает его в формате XML без тегов.Функция работает, когда я сохраняю строковую переменную Buffer глобальной.Но так как я хочу избежать плохих практик, я пытался передать это функции.Я предоставляю MWE, который показывает все случаи.
Ввод:
( "main",
["fred",
["barney"] ],
["george",
["jane",
["elroy"] ] ],
["homer",
["marge",
["bart"] ] ]
);
Это в основном представляет собой древовидную структуру, если я могу так назвать.Он хранит иерархию нескольких папок.
Правильный вывод для меня -
name my_gen_XML;
name "main";
name "fred";
name "barney";
name
name
name "george";
name "jane";
name "elroy";
name
name
name
name "homer";
name "marge";
name "bart";
name
name
name
Неверный вывод -
name my_gen_XML;
name "main";
name
name
name
В приведенном ниже фрагменте кода я упомянул 2 случая, называемых рабочими и нерабочими,Рабочий случай выдает правильный вывод.Нерабочий случай дает неправильный вывод.
Моя часть кода -
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @test = ( "main",
["fred",
["barney"] ],
["george",
["jane",
["elroy"] ] ],
["homer",
["marge",
["bart"] ] ]
);
my $testRef = \@test;
## Working - Case
#my $strBuffer;
my $final = constructTree($testRef," name");
print "$final \n";
# Name : constructTree
sub constructTree {
my ($test, $indentStr) = @_;
my $strBuffer = "";
## Non-Working Case
$strBuffer = populateTree($test, $indentStr, $strBuffer);
## Working - Case
#$strBuffer = populateTree($test, $indentStr);
$strBuffer = "name my_gen_XML;\n\n\n".$strBuffer;
return $strBuffer;
}
# Name : populateTree
sub populateTree {
## Non-Working Case
my ($array, $indentText, $strBuffer) = @_;
## Working - Case
#my ($array, $indentText) = @_;
my @list = @$array;
$strBuffer .= " $indentText \"$list[0]\";\n";
$indentText = " $indentText";
shift(@list);
foreach my $child ( @list ) {
## Non-Working Case
populateTree(\@$child, $indentText, $strBuffer);
## Working - Case
#populateTree(\@$child, $indentText);
$strBuffer .= " $indentText\n";
}
return $strBuffer;
}
Я пытался использовать переменные состояния для $strBuffer
, но безрезультатно.Я также попытался захватить вывод рекурсивной функции, но это дублировало мой случай.Также пытался использовать временную переменную, но в моем случае это тоже не помогло.
Я хотел бы знать, как получить «правильный вывод», используя «нерабочий код».Я думал, что это простое решение, но я не уверен.