自分用メモ。ちょっと触れてみようかと思って手を出してみたものの、幅広く知らないと何もできなそう。。
$ cat polyglot.txt $/*1;print 0?"ruby\n":"perl\n";#*/='';''.trim?console.log("node"):print("js"); $ perl polyglot.txt perl $ ruby polyglot.txt ruby $ js polyglot.txt js $ node polyglot.txt node
JavaScriptは/* */で領域コメントアウトできるので、
$/*1;#*/;
のように書けばperlとrubyは$/という変数に1を掛けるだけになり、そのなかで#を書けばそれ以降はコメント扱いで無視される。jsのロジックはその後ろに書けば良い。
perlかrubyかは三項演算子に0で条件を与えれば判別できるらしい。jsがnodeか否かはどちらかにしかない関数で分けることができそう。
python, perl, rubyを混ぜる場合は3重クォートの扱いをどうするかで分かれる?
$ cat polyglot.txt s='''==;print"perl\n"#';puts"ruby"#''';print "python" $ perl polyglot.txt perl $ ruby polyglot.txt ruby $ python polyglot.txt python
perlではs///演算子の区切りとして=を使うことで3重クォートを無視、rubyはクォートされたものがそのまま続いていても大丈夫?のようなので3重クォート後に1個クォートすればそこで一区切りになる。
あれ、でもこれだとJavaScriptはどう混ぜればいいんだろう…うーん