不能使用字符串 ("a,b,c") 作为 ARRAY 引用 [英] Can't use string ("a,b,c") as an ARRAY ref

查看:45
本文介绍了不能使用字符串 ("a,b,c") 作为 ARRAY 引用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为自动定理证明器编写一些代码.我想实现一个选项,让用户在 cmd 行上传递文件并让它在批处理模式下运行.

I am writing some code for an automated theorem prover. I wanted to implement an option for the user to pass a file on the cmd line and have it operate in batch mode.

这是解析文件并填充@clauses 数组的代码.

Here is the code to parse the file and fill the @clauses array.

# batch mode
if ($ARGV[0]) {

  my $filename = $ARGV[0];

  open(IN, "<", $filename);
  chomp(@clauses = <IN>);
  $conclusion2 = $clauses[@clauses - 1];

  # set sos as negated conclusion
  $SOS[0][0] = $conclusion2;

  # negate the negation to get the desired conclusion for later
  @conclusion = split(undef, $conclusion2);

  # look for a ~, remove it if you find it, add one if you don't
  for (my $i = 0 ; $i < @conclusion ; $i++) {

    # while you're at it.....
    # get rid of spaces and anything that isn't a ~ or letter
    $conclusion[$i] =~ s/( |[^A-Za-z~])//;
    if ($conclusion[$i] eq '~') {
      splice(@conclusion, $i, 1);
      $i--;
      $found = 1;
    }
  }

  if (!$found) {
    $conclusion = "~$conclusion2";
  }
  else {
    $conclusion = join(undef, @conclusion);
  }

  # now break up each line and make @clauses 2d
  for (my $a = 0 ; $a < @clauses ; $a++) {
    my $str = $clauses[$a];
    my @tmp = split(',', $str);
    for (my $b = 0; $b < @tmp; $b++) {
      $clauses[$a][$b] = $tmp[$b];       # ERROR HERE
    }
  }

  #       for(my $i=0; $i<@clauses;$i++)
  #       {
  #               print "$i";
  #               for(my $b=0; $b<=@{@clauses};$b++)
  #               {
  #                       print "$clauses[$a][$b]";
  #               }
  #               print "
";
  #       }
}

我输入的比我真正需要的要多,但麻烦的部分是当我试图用逗号分隔文件的行并使数组变为二维时.

I'm putting in more than I really need to, but the troublesome part is when I'm trying to break up the lines of the file by the commas and make the array two-dimensional.

在我标记的那一行,我收到错误

At the line I have marked I get the error

Can't use string ("a,b,c") as an ARRAY ref while "strict refs" in use

输入文件是这样设置的

a,b,c
b,~c
~b
~a

这将证明a一定是真的

这很奇怪,因为在交互部分的代码中,我几乎是逐字逐句地做完全相同的事情,而且效果很好.

It's weird, because in the code for the interactive section, I do the exact same thing, almost verbatim and it works perfectly.

EDIT 我确信不知何故,错误就在这一行

EDIT I'm certain that somehow, the error lies within this line

$clauses[$a][$b] = $tmp[$b];

错误信息如下:

can't use string ("a,b,c") as ARRAY ref while strict refs in use.

我认为我不需要任何取消引用,那么问题是什么?

I don't see the need for any dereferencing on my part so what could the problem be?

推荐答案

你应该尽可能多地展示你的程序,因为很难看到你没有声明的变量的范围.

You should really show as much of your program as possible, as it is hard to see the scope of the variables that you don't declare.

我可以向你保证,如果你有use warnings,那么split undef 将导致警告

I can assure you that, if you have use warnings in place as you should, then split undef will cause the warning

Use of uninitialized value in regexp compilation

问题是你设置了

$clauses[$a] = "a,b,c";
@tmp = ('a', 'b', 'c');

然后你尝试去做

$clauses[$a][$b] = $tmp[$b] for 0 .. 2

但是$clauses[$a] 是一个字符串,而不是一个数组引用.和写

but $clauses[$a] is a string, not an array reference. It is the same as writing

"a,b,c"[$b] = $tmp[$b] for 0 .. 2

没有意义.因此错误消息 Can't use string ("a,b,c") as an ARRAY ref.

which makes no sense. Hence the error message Can't use string ("a,b,c") as an ARRAY ref.

一个简单的解决方法是编写

A trivial fix would be to write

$clauses[$a] = undef;

立即之后

my $str= $clauses[$a]

这样数组元素现在是未定义的,当元素被复制时,Perl 可以自动激活一个匿名数组.

so that the array element is now undefined, and Perl can autovivify an anonymous array here when the elements are copied.

但是您的代码可能需要做更多的工作,所以这里有一个版本可以满足您的需求.我在末尾转储了 @clauses$conclusion 的值以显示它们的内容

However your code could use a little more work, so here is a version that does what I think you want. I have dumped the values of @clauses and $conclusion at the end to show their contents

use strict;
use warnings;

my $conclusion;
my $conclusion2;
my @SOS;

if (@ARGV) {

  my ($filename) = @ARGV;

  open my $in_fh, '<', $filename or die qq{Unable to open "$filename" for input: $!};
  chomp(my @clauses = <DATA>);
  close $in_fh;

  $conclusion2 = $clauses[-1];
  $SOS[0][0] = $conclusion2;

  $conclusion = $conclusion2;
  $conclusion =~ tr/A-Za-z~//cd;
  $conclusion = '~'.$conclusion unless $conclusion =~ tr/~//d;

  $_ = [ split /,/ ] for @clauses;

  print $conclusion, "
";
  use Data::Dump;
  dd @clauses;
}

输出

a
[["a", "b", "c"], ["b", "~c"], ["~b"], ["~a"]]

这篇关于不能使用字符串 ("a,b,c") 作为 ARRAY 引用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆