それは何で、なぜそれが必要なのでしょうか?
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 )に追加します。
これで、たとえば次のように関数を使用できます。
ul(
li( ' ' ).
li( ' ' ).
li( ' ' )
);
そして最も重要なことは、別の関数を追加するには、関数の名前で行を編集するだけです!