polyglot 基礎の基礎

自分用メモ。ちょっと触れてみようかと思って手を出してみたものの、幅広く知らないと何もできなそう。。

$ 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;#*/;

のように書けばperlrubyは$/という変数に1を掛けるだけになり、そのなかで#を書けばそれ以降はコメント扱いで無視される。jsのロジックはその後ろに書けば良い。
perlrubyかは三項演算子に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はどう混ぜればいいんだろう…うーん