Perl 強制終了の回避について
Attempt to free unreferenced scalar とは?
http://oshiete1.goo.ne.jp/qa4237453.html
の続きです。
とりあえず、下に現状で分かる最小限の再現性があるスクリプトを
書いておきます。
print &opentmpl("body");
print &opentmpl('footer'); # これがない場合はエラーにならない
sub opentmpl {
my $fn = shift;
my $VAR = shift || {};
my $file = &{$fn}();
®ex(\$file, $VAR, '__([A-Z_\d]+?(\[\d+?\])?)__', ['$VAR->{"%s"}', '$1']);
®ex(\$file, $VAR, '&{(.+?)}&', ['%s', '$1']);
return $file;
return undef;
}
sub regex {
my $str = shift;
my $VAR = shift;
my $pattern = shift;
my $replace = shift;
$$str =~ s/((([^\n]*?)$pattern(?=.*))+(\n?))/&func($1, $VAR, $pattern, @$replace)/egs;
return;
}
sub func {
my $str = shift;
my $VAR = shift;
my $pattern = shift;
my $buf = shift;
$str =~ s/$pattern/$@ = ''; $_ = eval(sprintf($buf, map { eval($_); } @_)); $@ ? $@ : $_/egs;
if($str =~ /^\s*\n?$/s) {
return;
}
return $str;
}
sub body {
print "Content-type: text/plain; charset=shift_jis\n\n";
return <<'HTML';
&{
return &opentmpl('table', {'TEST' => 'test'});
}&
HTML
}
sub table {
return <<'HTML';
__TEST__
HTML
}
sub footer {
return <<'HTML';
test
HTML
}
調べてみた限りではActivePerl for Win32以外のPerlでも同様のよう
です。
(Linux上でも同様のようです)
5.8.8ではエラーになりますが、5.10.xではエラーにならないようです。
(同じ環境において5.8.8では再現し、5.10.0にバージョンアップすると
再現しなくなり、再度5.8.8にバージョンダウンすると再現します)
本番機の環境が5.8.8で勝手にバージョンアップなどができないため、
5.8.8で正常に動作するようにするにはどうしたらよいでしょうか。
結構、無駄も多いと思いますので全く同じ動作をしながらより効率の
いい書き方ができたらいいなと思います。
(なお、実際には使用しているけど上記では使用していない部分が
含まれていてその部分がない場合もエラーにならないようです)