自分用メモ。ちょっと触れてみようかと思って手を出してみたものの、幅広く知らないと何もできなそう。。
$ 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
nodeJavaScriptは/* */で領域コメントアウトできるので、
$/*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はどう混ぜればいいんだろう…うーん