哈希中的意外值?

时间:2015-04-03 05:43:05

标签: arrays perl hash

我正在尝试创建一个迷宫生成器,我的代码遇到了一些问题。在我的脚本开头,我创建了一个多维数组(@maze),其中包含X个列和Y个行数。有一个循环遍历数组并将所有元素设置为初始值1. get_neighbors子例程假设使用topright,{创建哈希{1}},bottom个密钥。然后,它会根据传入的leftx坐标设置这些键的值。对于y键,我将其值设置为直接位于其上的元素{ {1}}。我假设如果例如,coords,top被传入,[ $y - 1 ][ $x ]将被设置为undef,因为它不是有效的元素/位置,但它不是..它被设置为1。不知道为什么..希望有人能够发现并解释为什么会这样。这是整个脚本:

0, 0

运行此脚本时的输出是:

top

2 个答案:

答案 0 :(得分:2)

在Perl中,数组的负下标从数组的末尾开始计算。

例如:

my @foo = ('a', 'b', 'c', 'd', 'e');

say $foo[-2];

会显示d

这应该说明发生了什么:

use warnings;
use strict;
use feature 'say';

my @maze = ( [ 'a' .. 'e' ],
             [ 'f' .. 'j' ],
             [ 'k' .. 'o' ],
             [ 'p' .. 't' ],
             [ 'u' .. 'y' ], );

for my $row (@maze) {
    say "@$row";
}

my %neighbors;
my ($x, $y) = (0, 0);

# The // defined-or was added in Perl 5.10.  These are equivalent:
# $foo = defined($bar) ? $bar : 'toast';
# $foo = $bar // 'toast';

$neighbors{'top'}    = $maze[ $y - 1 ][ $x ] // '-'; 
$neighbors{'bottom'} = $maze[ $y + 1 ][ $x ] // '-';
$neighbors{'left'}   = $maze[ $y ][ $x - 1 ] // '-';
$neighbors{'right'}  = $maze[ $y ][ $x + 1 ] // '-';

say "  $neighbors{top}";
say "$neighbors{left} $maze[$y][$x] $neighbors{right}";
say "  $neighbors{bottom}";

输出:

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
  u
e a b
  f

答案 1 :(得分:0)

尝试:

$neighbors{ top    } = $y > 0              ? $maze[ $y - 1 ][ $x ] : undef;
$neighbors{ bottom } = $y < $#maze         ? $maze[ $y + 1 ][ $x ] : undef;
$neighbors{ left   } = $x > 0              ? $maze[ $y ][ $x - 1 ] : undef;
$neighbors{ right  } = $x < $#{ $maze[0] } ? $maze[ $y ][ $x + 1 ] : undef;