Arrays 对数组使用perl引用时出错
我试图在perl中使用哈希表实现符号表。在下面的代码中,我创建了一个数组Arrays 对数组使用perl引用时出错,arrays,perl,reference,Arrays,Perl,Reference,我试图在perl中使用哈希表实现符号表。在下面的代码中,我创建了一个数组@Table,其元素是对另一个数组的引用(其元素也是数组引用)。代码如下: #!/usr/bin/perl sub getKey { my $name = $_[0]; my $count = 0; my $key = 0; my $len = length ($name); while ($count < $len) { my $char = substr ($name, $count,
@Table
,其元素是对另一个数组的引用(其元素也是数组引用)。代码如下:
#!/usr/bin/perl
sub getKey {
my $name = $_[0];
my $count = 0;
my $key = 0;
my $len = length ($name);
while ($count < $len) {
my $char = substr ($name, $count, 1);
$key = 7 * $key + ord ($char);
$count = $count + 1;
}
$key = $key % 20;
return $key;
}
sub Define {
(my $name, my $kind, my $type, my $Index, my $scope) = @_;
my $key = getKey($name);
print "key is $key\n";
@$entry = ("$name", "$kind", "$type", "$Index", "$scope");
unshift (@{$Table[$key]}, $entry);
print "$name is stored at key $key it is of kind $kind, type $type, at Index $Index and scope $scope\n";
print "entry is @$entry\n";
my $i = 0;
while ( $i < 20){
print "[$i]--> @{$Table[$i]->[0]}\n"; $i++;}
return;
}
our @Table;
my $i = 0;
while ($i < 20) {
$Table[$i] = [];
$i++;
}
Define ("x","field","int","0","0");
Define ("y","argument","int","0","1");
但我预计结果是:
[0]--> x field int 0 0
[1]--> y argument int 0 1
[2]-->
[3]-->
[4]-->
[5]-->
[6]-->
[7]-->
[8]-->
[9]-->
[10]-->
[11]-->
[12]-->
[13]-->
[14]-->
[15]-->
[16]-->
[17]-->
[18]-->
[19]-->
为什么输出与预期不同?这一行有问题:
@$entry = ("$name", "$kind", "$type", "$Index", "$scope");
由于未定义
$entity
变量,因此它将具有全局范围。因此,它的值在Define(…)
调用之间保持不变。这就是为什么你应该严格使用的原因之一;使用警告代码>在脚本的开头
以下是正在发生的事情:
- 在第一次
Define(…)
调用时:
- 表达式
@$entry=…
将创建匿名数组
- 将其引用保存到
$entry
- 用一些值覆盖数组的前5个元素
- 然后,对该数组的引用将被放入
@表的第一个元素中
- 通话时间:
$entity
仍指向同一匿名数组(因为它是全局数组)
- 新值将被放入数组中
- 然后,对同一数组的引用将被放入
@表的第二个元素中
- 现在您在
@表中有两次相同的引用
,第一个值被第二次运行覆盖
要解决此问题,您需要像下面这样声明$entry
的范围:
my $entry = [$name, $kind, $type, $Index, $scope];
我使用了[…]
严格使用;使用警告
Perl有一个非常好的哈希结构。你应该使用数组和散列算法来构建自己的吗?同意@mob的评论。请添加使用严格;使用警告代码>到脚本的开头。它将强制您声明所有变量(尤其是$entry
)。没有它,我们将浪费时间寻找错误,perl编译器可以立即找到错误。还要看看匿名数组引用:您不需要所有这些引号。
my $entry = [$name, $kind, $type, $Index, $scope];