Hi,
some weeks ago i did a little "improvement" to HTML::Template, at least i
think it is a improvement ;)
It changes the way arrays/loops are handled.
1.) If you pass in a array-reference, it will be not dereferenced anymore
I did this, so i can use a small Wrapper-class, which allows me to
tie a database-statement to an array, and returning the results row by
row, so i don't need to waste memory inside of mod_perl(Reading all
results at once).
2.) HTML::Template::Loop::output was changed, so it appends to a given
scalar-reference(the one from HTML::Template::output), this saves much
memory if you have a big loop and combine it with the print_to-option.
I would be really happy if someone else could test these patch, and give
me some feedback/results/benchmarks/changes in memory-usage.
I send this patch to Sam Tregar weeks ago, and i never answered, but maybe
someone here thinks that it's worth to have a look at it, because AFAIK
many ppl use mod_perl+HTML::Template (i do it myself) ;)
ciao, Nico
--- Template.pm Sat Feb 2 00:01:37 2002
+++ Template.pm.x Tue Jun 11 18:54:29 2002
@@ -1,6 +1,6 @@
package HTML::Template;
-$HTML::Template::VERSION = '2.5';
+$HTML::Template::VERSION = '2.5-masta';
=head1 NAME
@@ -2364,7 +2364,8 @@
if (defined($value_type) and length($value_type) and ($value_type eq 'ARRAY' or
((ref($value) !~ /^(CODE)|(HASH)|(SCALAR)$/) and $value->isa('ARRAY')))) {
(ref($param_map->{$param}) eq 'HTML::Template::LOOP') or
croak("HTML::Template::param() : attempt to set parameter '$param' with an
array ref - parameter is not a TMPL_LOOP!");
- $param_map->{$param}[HTML::Template::LOOP::PARAM_SET] = [@{$value}];
+#_masta_ $param_map->{$param}[HTML::Template::LOOP::PARAM_SET] = [@{$value}];
+ $param_map->{$param}[HTML::Template::LOOP::PARAM_SET] = $value;
} else {
(ref($param_map->{$param}) eq 'HTML::Template::VAR') or
croak("HTML::Template::param() : attempt to set parameter '$param' with a
scalar - parameter is not a TMPL_VAR!");
@@ -2508,7 +2509,7 @@
defined($$line) and $result .= $$line;
} elsif ($type eq 'HTML::Template::LOOP') {
if (defined($line->[HTML::Template::LOOP::PARAM_SET])) {
- eval { $result .= $line->output($x, $options->{loop_context_vars}); };
+ eval { $line->output($x, $options->{loop_context_vars},\$result); };
croak("HTML::Template->output() : fatal error in loop output : $@")
if $@;
}
@@ -2768,14 +2769,15 @@
my $self = shift;
my $index = shift;
my $loop_context_vars = shift;
+ my $result_ref = shift;
my $template = $self->[TEMPLATE_HASH]{$index};
my $value_sets_array = $self->[PARAM_SET];
return unless defined($value_sets_array);
- my $result = '';
my $count = 0;
my $odd = 0;
- foreach my $value_set (@$value_sets_array) {
+ foreach my $value_set_x (@$value_sets_array) {
+ my $value_set = $value_set_x;
if ($loop_context_vars) {
if ($count == 0) {
@{$value_set}{qw(__first__ __inner__ __last__)} = (1,0,$#{$value_sets_array}
== 0);
@@ -2787,14 +2789,14 @@
$odd = $value_set->{__odd__} = not $odd;
}
$template->param($value_set);
- $result .= $template->output;
+ $$result_ref .= $template->output;
$template->clear_params;
@{$value_set}{qw(__first__ __last__ __inner__ __odd__)} = (0,0,0,0)
if ($loop_context_vars);
$count++;
}
- return $result;
+# return $result;
}
package HTML::Template::COND;