deq blog このページをアンテナに追加 RSSフィード

2007-06-04 ICPCの問題をPerl 6で解いてみる

[] ICPCの問題をPerl 6で解いてみる

Higher-Order Perl: Transforming Programs with Programsを読んでいたらなんとなくPerl 6で遊びたくなってきたのでICPC関連の簡単な問題をいくつかPerl 6で解き直してみました。問題はACM/ICPC国内予選突破の手引きのリストのうち上からチョイス。


Hanafuda Shuffle

#! /usr/bin/pugs

loop {
  my ($n, $r) = (in, in);
  last if $n == 0 and $r == 0;

  my @cards = (1..$n).reverse;
  for 1..$r {
    my ($p, $c) = (in, in);
    my @cut = @cards.splice($p-1, $c);
    unshift @cards, @cut;
  }
  @cards.shift.say;
}

exit;

{
  my $line = '';
  sub in {
    $line = =<> if $line eq '';
    return $0 if $line ~~ s/\s*(\S+)\s*//;
    die "No more input";
  }
}

この入力用の in 関数は以降使いまわしです。

When Can We Meet?

#! /usr/bin/pugs

loop {
  my ($n, $q) = (in, in);
  last if $n == 0 and $q == 0;

  my %schedule;
  for 1..$n {
    for 1..in { %schedule{in}++; }
  }

  my $max = %schedule.keys.map:{ [ $^k, %schedule{$^k} ] }.reduce:{ $^x[1] > $^y[1] ?? $^x !! $^y };
  say $max[1] >= $q ?? $max[0] !! 0;
}

exit;

{
  my $line = '';
  sub in {
    $line = =<> if $line eq '';
    return $0 if $line ~~ s/\s*(\S+)\s*//;
    die "No more input";
  }
}

maxをreduceで求めてみるテスト。正直微妙。

Get Many Persimmon Trees

#! /usr/bin/pugs

loop {
  my $n = in;
  last if $n == 0;
  my ($w, $h) = (in, in);

  my %field;
  %field{ join ',', in, in } = 1 for 1..$n;

  my ($s, $t) = (in, in);
  my $max = 0;
  for 1..$w -> $x {
    for 1..$h -> $y {
      my $count = 0;
      for 0..$s-1 -> $dx {
        for 0..$t-1 -> $dy {
          $count += %field{ join ',', $x+$dx, $y+$dy };
        }
      }
      $max = $count if $count > $max;
    }
  }

  say $max;
}

exit;

{
  my $line = '';
  sub in {
    $line = =<> if $line eq '';
    return $0 if $line ~~ s/\s*(\S+)\s*//;
    die "No more input";
  }
}

実直に。

Numeral System

#! /usr/bin/pugs

my %table = < m 1000   c 100   x 10   i 1 >;
my @keys_in_order = <m c x i>;

{
  my $n = in;

  for 1..$n {
    my ($s1, $s2) = (in, in);
    my $sum = to_int($s1) + to_int($s2);

    for @keys_in_order -> $k {
      my $v = %table{$k};

      my $q = int($sum / $v);
      $sum = $sum % $v;

      print $q if $q > 1;
      print $k if $q > 0;
    }
    say;
  }
}

exit;

sub to_int ($str) {
  my $copy = $str;

  my $sum = 0;
  $sum += ($0 ne '' ?? $0 !! 1) * %table{$1} while $copy ~~ s/ (\d?) (<alpha>) //;
  return $sum;
}

{
  my $line = '';
  sub in {
    $line = =<> if $line eq '';
    return $0 if $line ~~ s/\s*(\S+)\s*//;
    die "No more input";
  }
}

regex記法がかなり変わっていて分かりません。[a-z]でcharacter classは作れなくなったのか…。

Sum of Different Primes

#! /usr/bin/pugs

my @p;
for 2..1120 -> $x { push @p, $x if $x % all(@p) != 0; }

loop {
  my ($n, $k) = (in, in);
  last if $n == 0 and $k == 0;

  solve($n, $k, 0).say;
}

exit;

{
  my %cache;
  sub solve ($n, $k, $idx) {
    return 1 if $n == 0 and $k == 0;
    return 0 if $n == 0 or $k == 0;

    my $key = join ',', $n, $k, $idx;
    if not defined %cache{$key} {
      my $count = 0;
      for $idx..@p-1 -> $i {
        last if @p[$i] > $n;
        $count += solve($n - @p[$i], $k - 1, $i + 1);
      }
      %cache{$key} = $count;
    }
    return %cache{$key};
  }
}

{
  my $line = '';
  sub in {
    $line = =<> if $line eq '';
    return $0 if $line ~~ s/\s*(\S+)\s*//;
    die "No more input";
  }
}

素数配列が1行で作れるのは気持ちがいい。ジャンクションはなかなか使い勝手がいいですね。この問題を走らせると,実行速度が明らかに C >> Perl 5 >>>> Pugs なのが手に取るように分かって,Pugsで 1120 14 はメモ化しているのにも関わらず止まりません…。

Keitai Message

#! /usr/bin/pugs

my @table = (
  [<. , ! ?>, ' '],
  [<a b c>],
  [<d e f>],
  [<g h i>],
  [<j k l>],
  [<m n o>],
  [<p q r s>],
  [<t u v>],
  [<w x y z>],
);

{
  my $n = in;

  for 1..$n {
    my @x = split '', in;

    while @x {
      my $num = @x.shift or next;
      my $seq = 0;
      $seq++ while @x.shift;
      @table[$num-1][ $seq % @table[$num-1] ].print;
    }
    say;
  }
}

exit;

{
  my $line = '';
  sub in {
    $line = =<> if $line eq '';
    return $0 if $line ~~ s/\s*(\S+)\s*//;
    die "No more input";
  }
}

Perl 5の qw() が <> で書けるようになった点は意外と便利。

2007-01-29 Pugs で Perl 6 入門 (3)

[] PugsPerl 6 入門 (3)

前回の記事から久しく時間が空いてしまいました。

前回ではPugsを使ってプログラムを動作させる方法を学びました。今回はPerl 6プログラムの書き始めですので,Perlらしくまずはファイルの入出力を取り扱うことにしましょう。

まず,試しに以下の readafile.pl を打ち込んで pugs readafile.pl と実行してみてください(ファイル名が違うと動きません)。readafile.pl のソースコードが画面に表示されたはずです。これはファイルを読み込んで出力するプログラムで,カレントディレクトリ内の "readafile.pl" というファイルの中身を表示します。

readafile.pl
#! pugs
use v6;

# ファイルを読み込みモード (read mode) で開く
my $in = open "readafile.pl";

# 一行ずつ読み込んで変数 $line に代入する
for =$in -> $line {
  # 末尾に改行をつけて変数 $line を出力する
  $line.say;
}

# ファイルを閉じる
close $in;

簡単な説明はコメントで書いていますが,それぞれ少し詳しく見ていきましょう。おっと,コメントの書き方をまだ説明していませんでした。# 記号を書くと,その行はそれ以降はコメントとみなされ,実行されません。Perl 6には様々なコメントの記法がありますが,たいていの場合は # で十分です。

ファイルのオープン

ファイルの中身を出力する手順は,

  1. ファイルをオープンする
  2. ファイルの中身を読み込む
  3. 読み込んだ文字列を出力する
  4. ファイルをクローズする

ですね。まずはファイルのオープンを見てみましょう。

ファイルのオープンは次のコードで行っています。

# ファイルを読み込みモード (read mode) で開く
my $in = open "readafile.pl";

まず,「my $in」を説明する必要がありますね。これは変数の宣言です。変数を使う際には必ず宣言をしなければなりません*1

my というのは正確には「レキシカルスコープを持つ変数の宣言」を意味するキーワードですが,単純に「変数を宣言するときは my を付ける」と覚えておけばOKです。それから $in という感じで識別子の前に $ 記号が付いていますね。Perlでは変数の前に記号(sigilと呼ばれています)が付き,一種の型を表しています。ただし型といっても,int型やdouble型というのではなくて,$scalar は1つの値を保持する変数スカラー変数),@array は配列(リスト)を保持する変数(順序配列),&code は関数などを保持する変数という意味での型です*2。int型やstring型といった区別はないので,Perl変数には数値や文字列などいろいろなものを代入することができます*3

open はファイルをオープンする関数で,引数としてファイル名のみを与えた場合,読み込みモード (read mode) でそのファイルを開きます。ファイルのオープンに成功すればファイルハンドルが返されます。ここでは,そのファイルハンドルを変数 $in に代入しています。

ファイルの中身を読み込んで出力する

ファイルの中身を読み込んで,さらにその文字列を出力する作業は次のコードで行っています。

# 一行ずつ読み込んで変数 $line に代入する
for =$in -> $line {
  # 末尾に改行をつけて変数 $line を出力する
  $line.say;
}

for 文はいわゆる foreach 文と呼ばれるもので,配列(リスト)から要素を一つずつ取ってきて処理する場合に使います。右矢印の後に変数名を書くと,その後のコードブロック(クロージャと呼ばれます)内でその変数を使って配列から取ってきた値にアクセスすることができます。例えば,

for 1, 2, 3 -> $num {
  $num.say;
}

とすると

1
2
3

と出力されます。これは,よくイテレータと呼ばれている仕組みです。ここではファイルの中身を一行ずつ取ってきて処理しようとしているのですが,処理したいものが単なるリスト(配列)でない場合,=$in という感じで変数名の前に = 演算子を置くことでイテレータとして扱うことができます。

for 文の中にある $line.say は $line の中身を改行を付けて出力しています。読み込んだものをそのまま改行を付けて出力すれば「改行が余分に多く付くのではないか?」と思いますが,Perl 6では入力はデフォルトでchompされる(末尾の改行を取り除くことはchompと呼ばれています)ので,$lineの最後には改行が付いていないので自分で改行を付けてあげないといけません。もし改行を付けたくない場合は print を使ってください。

なお,$line.say という記法を見て分かるとおり,sayは関数ではなくメソッドです。この場合は,文字列クラスのメソッドとなっています(これらはオブジェクト指向の用語ですが,分からない方はそういうものだと思って読み飛ばしていただいて構いません)。$line という変数には型がありませんが,データ自体に型があるので,ここらへんはよきに計らってくれるのです。もしメソッドが気に食わない場合は,同名の関数も提供されているので say $line というように記述しても動作します。

ファイルのクローズ

ファイルのクローズは次のコードで行っています。

# ファイルを閉じる
close $in;

close は与えられたファイルハンドルを閉じます。そのままですね。いちおう成功すれば真 (True) が返りますが,ここでは特に利用しないので戻り値は捨てています。

今回はここまで。次回はこれを発展させて自家製 cat コマンドを作ってみることにしましょう。

*1Perl 5では標準では変数の宣言を行わずに変数を使うことができました。Perl 6では標準でPerl 5 における use strict; が有効になっていると考えられます。

*2Rubyのようにスコープを表すわけではありません。

*3Perl 6では変数を型付けする機能が導入されており,必要であれば my Num $number のように型を付けて変数を宣言することができるようになります。

2006-11-23 Pugs で Perl 6 入門 (2),Re: ベイズの定理自体は使えない?

[] PugsPerl 6 入門 (2)

前回の記事ではPerl 6の処理系Pugsのインストールまでを行いました。今回はPugsを実行して簡単なPerlプログラムを動かしてみましょう。


Pugsの実行モード

Pugsには次の3つの実行モードがあります(名称は筆者が適当に名付けてみました):

プログラム実行モード」はインタプリタ処理系が普通にプログラムを実行するモードです。「対話モード」は「この関数をちょっと試してみたいんだけど」という感じで試しに数行のプログラムを打ち込んで実行するのに適したモードです。「ワンライナー実行モード」は1行だけの簡単なプログラムをコマンドラインから実行するのに適したモードです。

この入門記事では,主に通常のプログラム実行モードでプログラムを書いていきます。また,短いコードの挙動を確認するために,たまに対話モードを用います。

ワンライナー実行モードはこれ以降出てきませんので,せっかくなので最初のプログラムはワンライナーで実行してみましょう。

pugs -e "say 'Hello, Perl 6!';"

Hello, Perl 6! と表示されればOKです*1Perl 6の世界へようこそ!

Pugsの対話モードでの実行

はじめにPugsを対話モードの使い方を説明しておきます。対話モードの起動は単に pugs と打てばOKです。次のような起動画面が表示されます。

C:\Documents and Settings\kenzi>pugs -v
   ______
 /\   __ \
 \ \  \/\ \ __  __  ______  ______     (P)erl6
  \ \   __//\ \/\ \/\  __ \/\  ___\    (U)ser's
   \ \  \/ \ \ \_\ \ \ \/\ \ \___  \   (G)olfing
    \ \__\  \ \____/\ \____ \/\_____\  (S)ystem
     \/__/   \/___/  \/___/\ \/____/
                       /\____/               Version: 6.2.13
                       \/___/    Copyright 2005-2006, The Pugs Contributors
--------------------------------------------------------------------
 Web: http://pugscode.org/           Email: perl6-compiler@perl.org

Welcome to Pugs -- Perl6 User's Golfing System
Type :h for help.

Loading Prelude... done.
pugs> 

Perlの式 (expression) を入力すれば,その式の評価値が表示されます。試しに次のような式を入力してみましょう。意味は深く考えなくても大丈夫です。とりあえず入力してみてPerl 6の書き方に体を慣らしてみてください。

pugs> 3 + 4
7
pugs> 3 / 1.5
2/1
pugs> "abc" ~ "def"
"abcdef"
pugs> reverse 'xyz'
"zyx"
pugs> (1..10).reverse
(10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
pugs> my @a; for 2..50 -> $x { push @a, $x if $x % all(@a) != 0; } @a;
(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47)

なお,Fedora Coreのように端末がUTF-8対応であれば,

pugs> "端末がUTF-8対応ならOK".reverse
"KOらな応対8-FTUが末端"

というように日本語を直接扱うこともできます。Windows XPなどでは動きませんが。

終了は :q と打ち込んでください。

pugs> :q
Leaving pugs.

Pugsプログラムを実行

次にPerl 6で書かれたスクリプト(ファイル)をPugsで実行してみましょう。以下のソースコードを入力して,pugs helloperl6.p6 と打ってプログラムを実行してください。

helloperl6.p6
#! pugs

say 'Hello, Perl 6!';

ワンライナーのときと同様に Hello, Perl 6! と表示されれば成功です。Perl 6の世界へようこそ。

なお,say 関数はいわゆる print line 関数で,受け取った引数を標準出力に出力し,最後に改行文字 (\n) も出力する関数です。詳しくは後ほど。

最初の #! pugs の説明をしておきます。ファイル先頭の #! から始まる行は shebang 行と呼ばれていて,ここにはそのファイルを処理するプログラムのパスを記述します。これはシェルが読むためのものなので,Windowsでは関係ありませんが,Windowsでも上記のように #! pugs などと書いておくとそれらしくなります(趣味の問題なので書かなくても構いません)。Unix系のOSでは,chmod +x すれば ./helloperl6.p6 という感じで実行すればシェルが shebang 行を読んでそこに書かれてあるプログラムを実行してくれます。上記の記述では pugs helloperl6.p6 が実行されますが,おそらく pugs というプログラムがないと怒られるでしょう。その場合は #! /usr/bin/env pugs と書くか,もし pugs を /usr/bin/pugs にインストールしていれば #! /usr/bin/pugs と直接書けばOKです。筆者にはこの記事の読者の皆様がどのOSを使っていてどこにpugsをインストールしたのかは分かりませんので単に #! pugs とだけ書いておきますので,必要であれば適宜皆様が書き換えて使ってください。

今回はここまで。

*1:zsh などシェルによっては !' がシェルに認識されて展開されてしまいます。その場合は \!' と書いてください。

2006-11-14 Pugs で Perl 6 入門 (1)

[] PugsPerl 6 入門 (1)

Perl 6をちょっと触ってみようと思っても日本語の説明が少なく敷居が高いので,Perl 6の入門文書を書いてみようと思います。

読者としてはCやJava,Rubyなどの手続き型プログラミング言語の経験がある方を想定しています。Perl 5以前のPerlプログラミングの経験は必要ではありません。ただし,Perl 5とPerl 6の違いは注記として補足していきます。

週1での更新を目指してみます。


Perl 6 って何?

Perl 6は次世代のプログラミング言語です。Perl 6の設計のベースとなっているPerl 5は,効率的で強力な「実際に問題を解決するための」ハッカー御用達のプログラミング言語です。Perl 6は,近年の数々のプログラミング言語の発展を受け,他のプログラミング言語の素晴らしい機能をいいとこ取りしながら一から再設計されたインタプリタ型言語で,現代のプログラミング技法の知見が結集された成果です。

ただし,2006年現在,Perl 6の仕様はまだ固まっていません。Perl 6が安定して普通に使われるようになるのはおそらく2010年前後でしょう。しかし,すでにPerl 6を実装した処理系は存在しており,実際にPerl 6のプログラムを書いて動かすことができます。ですから,本物のハッカー達がどのような機能を求めているのか,そしてこれからのプログラミング言語がどのように発展していくのかを学び知ることは十分にできます。

なお,現在世間一般で使われているPerlはバージョン5です。Perl 6は従来のPerl 5とは互換性がありませんので,Perlで書かれた従来のプログラムPerl 6では動きません。


Pugs のインストール

現在Perl 6を動かすための処理系としてPugsがあります。PugsはHaskellというプログラミング言語で作られています。2006年11月14日現在のPugsの最新バージョンは6.2.13で,この記事でもPugs 6.2.13で動作するPerl 6を対象としています。

Windows

ここではWindows上でPugsをコンパイルしてインストールする手順を説明しています。コンパイルには多少時間がかかります(1時間程度)。もしコンパイルが面倒な方は http://jnthn.net/perl6/ からWindows用バイナリ pugs-win32.zip をダウンロードすることができます。ただし,(未確認ですが)その場合はPerl 5モジュールが使えないと思うので注意してください。

まず,はじめに最新の ActivePerlGlasgow Haskell Compiler (GHC) をインストールしておきます。2006年11月14日現在の最新版はActivePerl 5.8.8とGHC 6.6で,ActivePerlは5.8.x系,GHCは6.6が推奨です。両方ともMSIインストーラが提供されています。それぞれ perl.exe と ghc.exe には環境変数PATHのパスを通しておいてください。

もしパス中にバージョン1.50以外の nmake があればコンパイルに失敗する可能性があります。もしPATH中に nmake.exe がなければ勝手にマイクロソフトのWebサイトからダウンロードして perl.exe と同じフォルダにインストールするので,できれば nmake.exe がPATH中にない方がよいと思います。

PerlとGHCがインストールできれば,CPANの http://search.cpan.org/dist/Perl6-Pugs/ からPugsソースコード (Perl6-Pugs-6.2.13.tar.gz) をダウンロードし,tarballを展開します。圧縮展開のソフトウェアは 7-Zip が個人的におすすめです。なお,展開したパス中に日本語が使われているとGHCがコンパイルにこけるので,「デスクトップ」などは避けてください。同様にスペースも避けた方がいいでしょう。

コマンドプロンプトを開いて,展開した Perl6-Pugs-6.2.13 フォルダに移動し,まず set LANG=C を実行し,続いて perl Makefile.PL を実行します。うまくいけば,次に nmake でコンパイルします。

もしインストール中に Undefined subroutine &main::UpdateHTML_blib called at -e line 1. というエラーが出る場合は,ActivePerlをインストールしたフォルダ内の site/lib/ActivePerl/DocTools.pm が古いまま残ってしまっているので,lib/ActivePerl/DocTools.pm が存在するのを確認して site/lib の方の DocTools.pm や DocTools フォルダを削除すればOKです。

nmake が無事終われば,通常は次に nmake test を実行しますが,テストには時間がかかるので省いても問題ないでしょう。そのまま nmake install を実行してインストールしてください。nmake install が終了すれば完了です。perl.exe と同じフォルダに pugs.exe などがインストールされます。pugs -v と打って次のような出力がなされればOKです。

C:\Documents and Settings\kenzi>pugs -v
   ______
 /\   __ \
 \ \  \/\ \ __  __  ______  ______     (P)erl6
  \ \   __//\ \/\ \/\  __ \/\  ___\    (U)ser's
   \ \  \/ \ \ \_\ \ \ \/\ \ \___  \   (G)olfing
    \ \__\  \ \____/\ \____ \/\_____\  (S)ystem
     \/__/   \/___/  \/___/\ \/____/
                       /\____/               Version: 6.2.13
                       \/___/    Copyright 2005-2006, The Pugs Contributors
--------------------------------------------------------------------
 Web: http://pugscode.org/           Email: perl6-compiler@perl.org

Pugs 6.2.12以前を使っていた方: Pugs 6.2.13以降は標準でperl5がembedされ,parrotがembedされませんので,perl5だけをembedする場合は環境変数PUGS_EMBEDを設定する必要はありません。

Fedora Core

perl -v でPerl 5の処理系がインストールされているか確認できます。Perlがインストールされていなければyumで yum install perl とインストールすればいいでしょう。5.8.xがあれば大丈夫です。

次に Glasgow Haskell Compiler (GHC) をインストールします。Not Found を使って yum れば簡単です... といいたいところなのですが,あまりメンテされていないようです。まずは 404 Error - Not Found あたりを参考に yum install ghc すればGHC 6.4.1(Fedora Core 4の場合)かGHC 6.4.2(Fedora Core 4の場合)が入ると思います。ghc --version でインストールの確認とバージョンの確認ができます。なお,2006年11月14日現時点での最新バージョンはGHC 6.6なのでGHC 6.4.xは少し古く,将来のPugsではGHC 6.4系のサポートが打ち切られるので,そのときは気をつけましょう。

次に hs-plugins というライブラリをインストールします。Fedora Core 4でGHC 6.4.1がyumで入っていれば,yum install hs-plugins-641 でインストールできます。そうでなければ,CPUがx86であれば少し古いですがFC4用のリポジトリのhs-pluginsページからhs-plugins-0.9.8-1.i386.rpmをダウンロードし,rpm -ivh hs-plugins-0.9.8-1.i386.rpm でインストールします(最新のhs-plugins 0.9.10を使いたい場合はこのページあたりを参考にソースコードからインストールすればいいでしょう)。もし libreadline.so.4 がないと怒られた場合は,yum install compat-readline43 などで readline4 をインストールしてから hs-plugins をインストールします。

PerlとGHCがインストールできれば,CPANの http://search.cpan.org/dist/Perl6-Pugs/ からPugsソースコード (Perl6-Pugs-6.2.13.tar.gz) をダウンロードし,tar zxf Perl6-Pugs-6.2.13.tar.gz といった感じでtarballを展開します。展開した Perl6-Pugs-6.2.13 フォルダに移動し,export LANG=C をしてから perl Makefile.PL を実行します。何も文句が言われずに Enter 'make' to build Pugs. と促されたら,促されるとおりに make しましょう。

make が無事終われば,通常は次に make test を実行しますが,テストには時間がかかるので省いても問題ないでしょう。そのまま make install を実行してインストールしてください。make install が正常に終了すれば,pugs -v と打って次のような出力がなされればインストール成功です。

[deq@l243-56]~% pugs -v
   ______                                                           
 /\   __ \                                                        
 \ \  \/\ \ __  __  ______  ______     (P)erl6                 
  \ \   __//\ \/\ \/\  __ \/\  ___\    (U)ser's           
   \ \  \/ \ \ \_\ \ \ \/\ \ \___  \   (G)olfing      
    \ \__\  \ \____/\ \____ \/\_____\  (S)ystem           
     \/__/   \/___/  \/___/\ \/____/                           
                       /\____/               Version: 6.2.13
                       \/___/    Copyright 2005-2006, The Pugs Contributors
--------------------------------------------------------------------
 Web: http://pugscode.org/           Email: perl6-compiler@perl.org 

2006-10-18 pugs 6.2.13をWindowsにインストール

[][] pugs 6.2.13をWindowsにインストール

つい先日(2006年10月17日)Pugs 6.2.13がリリースされたようなので早速インストール。

最初は(前と同じように)cygwin上でコンパイルしようとしたけど失敗。なんかよくわからん (Windows用ghcの) エラーが出る。

そこでActivePerlはどうかと思ってそちらを使ってインストールを試みる。これが正解。おそらく現時点でWindowsでPugsを利用するのに一番いい方法がこれだと思います。理由はこんなところ:

  • 事前に必要なものはおそらく Windows 版 GHC(MSIインストーラがあるので簡単)と ActivePerl のみ。perl.exeとghc.exeにはパスを通しておく。
  • インストールは簡単で,perl Makefile.PL; nmake; nmake install で完了*1。(どういう仕組みか知らないけど) nmake が Perl/bin の中に入ってて楽にビルドできます。
  • ちゃんとperl5がembedされます。つまり use perl5:LWP::UserAgent; なんて書けばActivePerlの(Perl 5の)モジュールがWindowsでも使えます。ハッピー。ちなみに Perl 5 の embed は(6.2.12と6.2.13のどちらからか知らないけれど)デフォルトでされるようになったので,わざわざ環境変数を設定する必要はありません。

WindowsだとActivePerlくらい持ってるだろうし,GHCもPugsも簡単にインストールできるし,ついでに PXPerl ではされない *2 Perl 5のembedもされる,とずいぶん便利になりました。

それでは皆さん Happy Coding!

*1:nmake test は特に指示されなかったのでやらなかったけど,それってどうなんだろう。

*2:最新版は知らないけれど。