オンデマンド機能

PERL 'eでは、オンザフライで関数を作成できることをご存知ですか?

それは何で、なぜそれが必要なのでしょうか?



html_tag関数があるとします:



sub html_tag {

my $tag = shift;

my $msg = shift;

return sprintf( '<%s>%s</%s>' , $tag, $msg, $tag);

}











また、対応するhtmlタグの名前を使用して多くの機能を実行する必要があります。 もちろん、すべての関数定義を手動で作成できます。



sub h1 { return html_tag( 'h1' ,@_); }

sub h2 { return html_tag( 'h2' ,@_); }

sub h3 { return html_tag( 'h3' ,@_); }

...










しかし、どういうわけか間違っている、あまりにも多くの手紙。 この問題を解決するより美しい方法があることがわかりました。







my @tags = qw(h1 h2 h3 p div span ul ol li em strong );

for my $tag (@tags) {

no strict 'refs' ;

*$tag = sub { return html_tag($tag,@_); };

}











必要なすべての関数名を記述し、それらのリンクをパッケージのグローバルシンボルテーブルに追加します。 実際には、すべての魔法が並んでいます



* $ tag = sub {html_tag($タグ、@ _)を返す ; };



sub {}は、匿名関数へのリンクを返します(内部では、 html_tagが最初の引数と同じ名前のタグで呼び出されます)。



割り当て* $ tag =は、関数名($タグ変数に含まれる)をグローバルパッケージシンボルテーブル( typeglob )に追加します。



これで、たとえば次のように関数を使用できます。



print

ul(

li( ' ' ).

li( ' ' ).

li( ' ' )

);











そして最も重要なことは、別の関数を追加するには、関数の名前で行を編集するだけです!






All Articles