我正在尝试创建一个简单的Perl脚本来获取一系列数字(0..255
),遍历每个数字并找到不在另一个数组中的数字。
这一点,我可以找到我的游戏中尚未占用哪些Minecraft块ID。第一个数组是范围0..255
,它是最大可能的块ID。下一个数组是已经使用的ID,它们已经列出了一个列表。
所以我想要一种检查每个可能的块id的循环。我会在到达计算机时发布我的内容。
答案 0 :(得分:4)
最简单(也是最快)的方法是将另一个数组转换为哈希值,然后检查是否存在键:
my %hash = map { $_ => 0 } @array2;
print (exists $hash{$_} ? "$_ is there\n" : "$_ is not there\n") for(0..255);
答案 1 :(得分:1)
为什么不使用
$occupied_lookup[$_] = 1 for 4,5,6;
而不是
@occupied_indexes = (4,5,6);
更轻松,更快速地占领某些东西:
$occupied_lookup[$_] = 1;
更容易,更快地制作无人居住的东西:
$occupied_lookup[$_] = 0;
检查是否有东西更容易,更快:
if ($occupied_lookup[$_])
查找所有占用的索引仍然很容易:
my @occupied_indexes = grep $occupied_lookup[$_], 0..$#occupied_lookup;
(其他人建议使用散列,但数组更快。)
答案 2 :(得分:0)
两个数组之间的差异并不一定意味着您需要for循环或while等。这会打印@allblocks中不在@occupiedones中的项目。
#!usr/bin/perl
use warnings;
use strict;
my @allblocks=(0...255);
my @occupiedones=(1,2,80,255)
my %occupiedones=map{$_=>1} @occupiedones;
# the difference of two arrays
my @diff=grep(!defined $occupiedones{$_}, @allblocks);
# proof it works
print "This is in one array and not the other:\t$_\n" foreach (@diff);
答案 3 :(得分:0)
这就是你想要的。代码中的注释解释。
#!/usr/bin/perl
use warnings;
use strict;
# Print members of @b that are not in @a.
# That is, loosely speaking, print @b minus @a.
my @a = (10, 20, 30, 40, 50);
my @b = (22, 25, 30, 40, 42);
my %a = map {$_=>1} @a;
$a{$_} or print "$_ " for @b;
print "\n";
我们的想法是将@a
转换为哈希%a
,然后使用哈希来控制减法。在哈希中,只有关键是感兴趣的;相应的值都只是1
,这对于这种应用来说是常规的(虚拟值是Perl在C ++中实现的方式称为 set )。