不能使用字符串 ("a,b,c") 作为 ARRAY 引用 [英] Can't use string ("a,b,c") as an ARRAY ref
问题描述
我正在为自动定理证明器编写一些代码.我想实现一个选项,让用户在 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屋!