このプログラムをなんとなーく記述すると、大体以下のようなものになるんじゃないかと思います。 とかいって、この時点でいろいろと突っ込まれそうな気もしないでもないですが。。。
#!/usr/bin/perl -T # p2h.pl - プレーンテキストを HTML に変換する use strict; use warnings; # 改行モードだけ気を使ってみる use open IN => ':crlf'; binmode STDIN, ':crlf'; print <<ENDLINE; <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <title>Output from p2h.pl</title> </head> <body> ENDLINE $/ = ''; # 1 つ以上の連続する空行をレコードの終端として扱う while (<>){ chomp; s/[<>&"]/'&'.{qw(< lt > gt & amp " quot)}->{$&}.';'/ego; # HTML の為のエスケープ処理 print "<p>$_</p>\n\n"; } # 残りの骨組みを出力 print <<ENDLINE; </body> </html> ENDLINE __END__
話がややこしくなるので文字セットとかは気にしないことにしましょう。 改行モードだけはなぜか気を使ってますが (Unix 風環境で CR-LF なテキスト処理をすると、:raw
ではうまく行かなかったりする為)。
それよりもこのプログラムの突っ込みどころは、行頭の sh-bang で -T
オプションとかつけちゃってる割に、プログラム的には汚染モードを用いている意味がこれっぽっちも無いところです。 このプログラム、驚くべきことに、汚染チェックは一つも発生しません。 その為、テキスト内容を出力する箇所で行っているエスケープ処理も単なる置換操作であり、 ブラックリスト方式の処理であるにもかかわらず、スクリプトは普通に実行出来ちゃったりします。
murachi@maha ~ $ ./p2h.pl test.txt <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <title>Output from p2h.pl</title> </head> <body> <p>汚染モードをうまく活用すると、 <安全ではない> Perl プログラムを作ってしまう事故が、 いくらか起こりにくくなります。</p> <p>汚染モードを活用した Perl プログラミングに実践してみましょう。</p> </body> </html> murachi@maha ~ $
ここでもし、汚染チェックを行うバージョンの print
が存在したらいいんだがなぁ、とか考えてみることにします。 ていうか、実際問題として、引数の汚染チェックを行ってから print
するサブルーチンを、 Taint モジュールを用いて実装することは可能です。例えば以下のように。
use Taint qw/tainted/; sub spill { if (tainted @_){ my (undef, $file, $line) = caller; die "Insecure request at $file line $line.\n"; } print @_; }
理想的には組み込みの print
関数をオーバーライドしてしまいたいところなのですが、 あいにく print
関数はオーバーライドできない模様。 仕方がないので別の名前のサブルーチンで置き換えることにします。 出力先が STDOUT
で固定されているので返って使いやすいかもしれません (負け惜しみ)。
セコメントをする