1

短いテンプレートにperl Text::Templateを使用しようとしていますが、これまでのところ、配列を反復処理できませんでした。

これは、私がやろうとしていることを示すために書いた短いテスト プログラムです。

#!/usr/bin/perl
use Text::Template;
my $template = Text::Template->new(TYPE => 'STRING', SOURCE => <<'__EOT__');
array[0]: { $array[0] }
{ foreach my $i (@array) { }
 {$i}
}
__EOT__
print $template->fill_in(HASH => { array => [qw(item1 item2)]});

Text::Template マニュアルによると、私はこれが出力されることを期待していました: array[0]: item1 item1 item2 しかし、代わりに array[0]: item1 を出力します

(つまり、ループの外側の最初の行と空の行の出力)。

テンプレート内でループを実際に使用している例を Web のどこにも見つけることができませんでしたが、ドキュメントには「そのまま機能する」と書かれています。

私は何が欠けていますか?

4

2 に答える 2

1
my $template = Text::Template->new(TYPE => 'STRING', SOURCE => <<'__EOT__',  DELIMITERS => [qw(<% %>)],);

別の区切り文字を選択します。ドキュメンテーションでは、さまざまな理由で何度か実行することをお勧めしています。主な理由は、Perl コードでも{}中かっこを使用するため、作業が簡単になるためです。また、次のようにも述べています。

テンプレートの解析はバックスラッシュ エスケープがないことで単純化されるため、代替の DELIMITERS を使用すると、解析プロセスが 20 ~ 25% 高速化される場合があります。これは、{ と } の最初の選択が非常に悪かったことを示しています。

無効{$i}なコンテキストにあるため、ここでは機能しません。ドキュメントには次のように記載されています。

最後に実行されたステートメントの結果は、スカラー コンテキストで評価されます。このステートメントの結果は文字列であり、プログラム フラグメント自体の代わりにテンプレートに挿入されます。

$OUT次の変数で書き換えます。

<% foreach my $i (@array) {
    $OUT .= $i
} %>

ドキュメントには次のように記載されています。

この変数に追加したものはすべて、テンプレートの出力に表示されます。また、プログラム フラグメントで $OUT を使用すると、フラグメントをその戻り値に置き換える通常の動作が無効になります。代わりに、フラグメントは $OUT の値に置き換えられます。

<% $OUT .= $_ for @array %>

同じ結果ですが、短くなります。

于 2011-05-06T07:36:11.933 に答える
0

いくつかの実験は、これが次のことを示しています。

{ stuff }

この疑似 perl のようなものに (効果的に) 変換されます。

my $x = eval(stuff);
$template =~ s/{ stuff }/$x/;

したがって、「もの」は、テンプレートに入れる何かを返すように式である必要があります。あなたの「もの」はforeach値を持たないループであるため、テンプレートは何も興味深いことをしません。

のテストを見るとText::Template(例については常にテスト スイートにアクセスしてください。CPAN パッケージのテスト スイートは、物事がどのように機能するかを学習するのに非常に役立ちます)、次のようなことがわかります。

{ $t = ''; foreach $n (1 .. 20) { $t .= $n . ' ' } $t }

使用方法に注意してください$t。これは、テンプレートに次のようなものが必要であることを示しています。

array[0]: { $array[0] }
{ $t = ''; foreach my $i (@array) { $t .= "\t$i\n" } }

$OUT上記の代わりになる特別な変数もあり$tます。CPAN パッケージのドキュメントは概して非常に優れており、読む価値があります。他の言語で作業していると、見逃してしまうでしょう。

于 2011-05-06T07:33:32.113 に答える