Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 对数组使用perl引用时出错_Arrays_Perl_Reference - Fatal编程技术网

Arrays 对数组使用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,

我试图在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, 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];