Quine を書いてみる、初

Quine、すなわち、自分自身を出力するコード、昔から興味はあったが書いたことはなかった。
短くもないし、とりたてて特別なトリックがあるわけでもないけど、初めて作った作品なので掲載。

use strict;
use warnings;

my $s = <<'__EoD';
use strict;                                                                     
use warnings;                                                                   
                                                                                
my $s = <<'__EoD';                                                              
x                                                                               
$s =~ s/x/$s\__EoD/;                                                            
print $s;                                                                       
__EoD                                                                           
$s =~ s/x/$s\__EoD/;                                                            
print $s;

実行結果。

[takeyuki@sunya ~]$ perl a.pl > b.pl; diff -y -W 60 a.pl b.pl
use strict;                     use strict;
use warnings;                   use warnings;

my $s = <<'__EoD';              my $s = <<'__EoD';
use strict;                     use strict;
use warnings;                   use warnings;

my $s = <<'__EoD';              my $s = <<'__EoD';
x                               x
$s =~ s/x/$s\__EoD/;            $s =~ s/x/$s\__EoD/;
print $s;                       print $s;
__EoD                           __EoD
$s =~ s/x/$s\__EoD/;            $s =~ s/x/$s\__EoD/;
print $s;                       print $s;

追記

エッセンスを抜き出すと次のようになった。

$_=<<'';
$_=<<'';
x
s/x/$_/;print

s/x/$_/;print

まだまだ golf に参加するようなレベルじゃないよね。

[takeyuki@sunya ~]$ perl a.pl > b.pl; diff -y -W 60 a.pl b.pl; wc -c a.pl
$_=<<'';                        $_=<<'';
$_=<<'';                        $_=<<'';
x                               x
s/x/$_/;print                   s/x/$_/;print

s/x/$_/;print                   s/x/$_/;print
49 a.pl

それにしても収穫だったのは、ヒアドキュメントの終了を示す文字列として空文字列が使えることを知ったこと。