私はゲーム システム (ウォーゲームなど) の作成に取り組んでおり、16 進マップを作成および表示するためのシステムを作成しています。x=(0..maxx) と y=(0..maxy) のネストされたループを繰り返し実行していることにすぐに気付きました。そこで私は、どこかで見つけたコード (高度な perl の本の 1 つ、場所は忘れました) を適応させて、この種のループ処理を行うためのより簡単な方法を作成しようとしました。これは私が思いついたものです:
sub fillmap (&@) {
my $code = shift;
no strict 'refs';
use vars qw($x $y);
my $caller = caller;
local(*{$caller."::x"}) = \my $x;
local(*{$caller."::y"}) = \my $y;
foreach $x (0..5) {
foreach $y (0..3) {
warn "fillmap $x,$y\n";
&{$code}($x,$y);
}
}
}
のように動作すると思われますが、 andの代わりにandsort
を使用します。$x
$y
$a
$b
注: warn ステートメントはデバッグ用です。また、x と y の範囲を単純化しました (渡された配列が maxx と maxy の値を決定しますが、これらを計算するためのルーチンでこの議論を混乱させたくありませんでした... maxx=5 にハードコードし、 maxy=3)
したがって、このルーチンのこの実行は次のようになります。
fillmap {warn "$x,$y\n";} @map;
x、yペアのリストを生成する必要があります。しかし、代わりに、それは私にこれを与えます:
fillmap 0,0
,
fillmap 0,1
,
fillmap 0,2
,
fillmap 0,3
,
fillmap 1,0
,
...
「fillmap」行は、デバッグ用のサブルーチンからのものであることに注意してください。ただし、x、y の各ペアの代わりに、コンマを取得するだけです ($x と $y は定義されていません)。
私は何を間違っていますか?